在XCode中静态链接OpenSSL

时间:2015-06-19 17:19:20

标签: xcode openssl static-linking dylib

我正在尝试将libssl.alibcrypto.a静态库链接到XCode命令行项目[在Link Binary With Libraries下]。我在搜索路径中包含了Openssl头文件。

编译成功但执行失败, dyld: Library not loaded: /usr/local/ssl/lib/libcrypto.1.0.0.dylib

为什么我在静态链接时会查找dylib?如何解决这个问题?

任何帮助都会很明显。

1 个答案:

答案 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 SigningGatekeeper Service ......

要在MAC Developer程序下对您的库副本进行编码,只需:

LD_LIBRARY_PATH