Xcode "ld: library not found [...] for architecture x86_64"

Xcode "ld: library not found [...] for architecture x86_64"

我想在我的 swift-项目中包含 libgpg-error 和 libgcrypt 并创建了以下 module.modulemaps:

libgpgererror:

module libgpgerror {
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/gpg-error.h"
    link "'/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib'"
    export *
}

libgcrypt:

module libgcrypt {
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h"
    link "'/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/libgcrypt-1.6.5.dylib'"
    export *
}

我还添加了 "Swift Compiler - Search Path/Import Paths": /Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/** 到项目和目标。 找到模块,路径正确。

但是,如果我想编译项目,我会收到以下错误:

ld: library not found for -l'/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib' for architecture x86_64

但如果我这样做

file /Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib

我得到输出

/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/libgpgerror-1.21.dylib: Mach-O 64-bit dynamically linked shared library x86_64

看来图书馆在正确的地方,也有正确的架构。


编辑

我找到了一个解决方法:我从模块映射中删除了 link 指令并手动 link 编辑了库;这似乎有效。但是为什么?

module libgpgerror {
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgpgerror/gpg-error.h"
    export *
}

link 指令仅指定 linked 库的名称。也就是说,它应该为库指定 linker 标志的后缀。该指令似乎采用“-l”并将名称连接起来以产生 linker 标志。

这意味着指定模块映射的正确方法如下。

module CGcrypt {
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h"
    link "gcrypt"
    export *
}

这将生成 linker 标志 -lgcrypt,这是正确的 linker 标志。

然而,还有另一个问题是 linker 需要能够找到 gcrypt 的 dylib 文件,默认情况下它只在某些路径上查找。这些路径可以通过 运行 clang -Xlinker -v 找到。我的输出如下所示:

tylercloutier$ clang -Xlinker -v
@(#)PROGRAM:ld  PROJECT:ld64-264.3.101
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em (tvOS)
Library search paths:
    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib
... more stuff ...

现在我不确定,但我怀疑正常的搜索路径可能是

/usr/lib
/usr/local/lib

但我认为 Xcode 改变了我的搜索路径指向 MacOSX10.11.sdk/usr/lib,顺便说一句,它与 /usr/lib 具有基本相同的文件集(它们不是symlinked)。事实上,在 El Capitan 中,由于系统完整性保护,即使 sudo 也不允许您编辑 /usr/lib.

因此,我遇到的问题是,即使我已经将我的库安装到 /usr/local/lib,但 clang 无法 link 它们。为了解决这个问题,我可以明确指定搜索路径。

swift build -Xlinker -L/usr/local/lib/

我们要开始比赛了。我什至可以生成一个 xcodeproj,它将在 Other Linker Flags.

中设置适当的 linker 标志
swift build -Xlinker -L/usr/local/lib/ --generate-xcodeproj

如果您在模块映射文件中省略了 link 指令,您可以将其指定为标志:

module CGcrypt {
    header "/Volumes/Xcode/Programme/Swifts/KCAnon/KCAnon_Client/Libs/libgcrypt/gcrypt.h"
    export *
}

像这样

swift build -Xlinker -L/usr/local/lib/ -lgcrypt

如何更改默认库搜索路径,我不知道。但是,如果其他人可以阐明这件事,那就太好了!