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
如何更改默认库搜索路径,我不知道。但是,如果其他人可以阐明这件事,那就太好了!
我想在我的 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
.
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
如何更改默认库搜索路径,我不知道。但是,如果其他人可以阐明这件事,那就太好了!