我正在尝试将libssl.a
和libcrypto.a
静态库链接到XCode命令行项目[在Link Binary With Libraries下]。我在搜索路径中包含了Openssl头文件。
编译成功但执行失败, dyld: Library not loaded: /usr/local/ssl/lib/libcrypto.1.0.0.dylib
。
为什么我在静态链接时会查找dylib?如何解决这个问题?
任何帮助都会很明显。
答案 0 :(得分:7)
为什么我在静态链接时会查找dylib?如何解决这个问题?
Apple的链接器使用dylib或共享对象(如果可用),无论您的链接器标记如-rpath
和-Bstatic
如何。他们甚至在iOS上进行,不允许使用dylib!
一旦你知道它就是一个众所周知的问题:)例如,参见Installing Crypto++ 5.6.2 on Mac OS X。 Crypto ++与Apple的工具存在同样的问题。
修复是使用-L
和-l
选项停止,并直接链接目标文件或存档。存档只是目标文件的集合,因此您可以互换使用它们。
要指定链接器的目标文件或存档,请参阅Linking to an object file。在Xcode下,您将完全指定的存档名称(如/usr/local/openssl-ios/lib/libcrypto.a
)添加到 其他链接标记 (OTHER_LDFLAGS
Xcode选项)。
将完整存档添加到OTHER_LDFLAGS
时,我相信您只需逐字添加 ,无需 任何开关,例如-l
或{{1 }}。您可能需要-L
(-Wl
),但 不 使用-Wl,/usr/local/openssl-ios/lib/libcrypto.a
({ {1}})。
当选项通过编译器驱动程序传递给链接器时,使用-l
。如果直接调用链接器,那么您不需要-l/usr/local/openssl-ios/lib/libcrypto.a
,也不应该使用它。
第二个选项是将-Wl
设置为-Wl
。 Apple似乎没有在Xcode Build Setting Reference中记录它,但它显然在我的Xcode副本下。请参阅Stack Overflow上的How to link a static library for iOS。
我似乎记得过去曾遇到过这方面的问题。它应该在理论上起作用,但在实践中不起作用。
第三个选项是从Xcode下使用的所有路径中删除dylib或共享对象,这样Xcode在使用GCC_LINK_WITH_DYNAMIC_LIBRARIES
时不会意外地找到它。
第四个选项是使用允许动态链接,但使用DYLD_LIBRARY_PATH
执行程序。它的OS X相当于YES
,并确保加载OpenSSL的副本(如1.0.2),而不是系统的OpenSSL版本(0.9.8)。
但我不喜欢这个选项,因为它要求你的软件用户做点什么。
由于消息 -lcrypto
而导致的另一种可能性是对您的库副本进行代码签名。它的发现有点奇怪但没有加载,所以我打算把它扔到那里以防它的OS X Code Signing或Gatekeeper Service ......
要在MAC Developer程序下对您的库副本进行编码,只需:
LD_LIBRARY_PATH