当我静态链接它时,为什么它会寻找 dylib?如何解决这个问题?
Apple 的链接器使用 dylib 或共享对象(如果可用),无论您的链接器标志如何,例如 -rpath 和 -Bstatic。他们甚至在不允许 dylib 的 iOS 上这样做!
一旦你知道它,它就是一个众所周知的问题:) 例如,请参阅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 Linker Flags(OTHER_LDFLAGS Xcode 选项)。
将完整存档添加到 OTHER_LDFLAGS 时,我相信您只需逐字添加它没有任何开关,例如 -l 或 -L。您可能需要-Wl (-Wl,/usr/local/openssl-ios/lib/libcrypto.a),但您不要使用-l (-l/usr/local/openssl-ios/lib/libcrypto.a)。 p>
当通过编译器驱动程序传递到链接器时,您使用 -Wl。如果直接调用链接器,则不需要-Wl,也不应该使用它。
第二个选项是将GCC_LINK_WITH_DYNAMIC_LIBRARIES 设置为YES。 Apple 似乎没有在Xcode Build Setting Reference 中记录它,但它显然在我的 Xcode 副本下。请参阅 Stack Overflow 上的 How to link a static library for iOS。
我似乎记得过去在这方面遇到过问题。它是理论上应该可行但在实践中行不通的事情之一。
第三种选择是从 Xcode 下使用的所有路径中删除 dylib 或共享对象,这样 Xcode 在使用 -lcrypto 时不会意外找到它。
第四个选项是使用允许动态链接,但使用DYLD_LIBRARY_PATH 执行程序。它的 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 的 Code Signing 或 Gatekeeper Service...
要在 MAC Developer 程序下对您的库副本进行代码签名,只需:
codesign -fs "Johnny Developer" /usr/local/ssl/lib/libcrypto.so