当我静态链接它时,为什么它会查找 dylib?如何解决这个问题?
Apple 的链接器使用 dylib 或共享对象(如果可用),无论您的链接器标志如何,例如-rpath
and -Bstatic
。他们甚至在 iOS 上做到了这一点,而 dylib 是不允许的!
一旦你了解了它,它就是一个众所周知的问题:) 例如,参见,在 Mac OS X 上安装 Crypto++ 5.6.2 https://stackoverflow.com/a/25733194/608639。 Crypto++ 与苹果的工具也有同样的问题。
解决方法是stop using -L
and -l
选项,并直接链接目标文件或存档。存档只是目标文件的集合,因此您可以互换使用它们。
要指定链接器的目标文件或存档,请参阅链接到目标文件 http://www.cocoabuilder.com/archive/xcode/264949-linking-to-an-object-file.html。在 Xcode 下,您添加完全指定的存档名称(例如/usr/local/openssl-ios/lib/libcrypto.a
) to 其他链接器标志 (the OTHER_LDFLAGS https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.htmlXcode 选项)。
将完整存档添加到时OTHER_LDFLAGS
,我相信你只是逐字添加它without任何开关,例如-l
or -L
. You may need -Wl
(-Wl,/usr/local/openssl-ios/lib/libcrypto.a
), 但是你don't use -l
(-l/usr/local/openssl-ios/lib/libcrypto.a
).
You use -Wl
当选项通过编译器驱动程序传递到链接器时。如果直接调用链接器,则不需要-Wl
并且不应该使用它。
第二个选项是设置GCC_LINK_WITH_DYNAMIC_LIBRARIES
to YES
。苹果似乎没有在其中记录它Xcode 构建设置参考 https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html,但它显然位于我的 Xcode 副本下。看如何链接 iOS 的静态库 https://stackoverflow.com/q/11064984/608639在堆栈溢出上。
我似乎记得过去曾遇到过这个问题。这是理论上应该起作用但在实践中不起作用的事情之一。
第三个选项是从 Xcode 下使用的所有路径中删除 dylib 或共享对象,以便 Xcode 在使用时不会意外找到它-lcrypto
.
第四个选项是使用允许动态链接,但执行程序DYLD_LIBRARY_PATH https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dyld.1.html。它的 OS X 相当于LD_LIBRARY_PATH
,并确保加载您的 OpenSSL 副本(如 1.0.2),而不是系统版本的 OpenSSL (0.9.8)。
但我不喜欢这个选项,因为它要求你的软件的用户做一些事情。
另一种可能性是由于消息dyld: Library not loaded: /usr/local/ssl/lib/libcrypto.1.0.0.dylib
是对您的库副本进行代码签名。它找到了但没有加载,这有点奇怪,所以我要把它扔掉,以防它的 OS X代码签名 https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html or 网守服务 https://support.apple.com/en-us/HT202491...
要在 MAC Developer 程序下对库副本进行代码签名,只需:
codesign -fs "Johnny Developer" /usr/local/ssl/lib/libcrypto.so