link XCode 中的静态 OpenSSL

Statically link OpenSSL in XCode

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

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

为什么在我静态 link 时它会寻找 dylib?如何解决?

任何帮助将不胜感激。

Why does it look for dylib when I am linking it statically? How can this be fixed?

Apple 的 linker 会使用 dylib 或共享对象(如果可用),而不管您的 linker 标志,如 -rpath-Bstatic。他们甚至在不允许使用 dylib 的 iOS 上这样做!

一旦您了解它,它就是一个众所周知的问题 :) 例如,参见 Installing Crypto++ 5.6.2 on Mac OS X。 Crypto++ 与 Apple 的工具存在同样的问题。

解决方法是使用 -L-l 选项 停止 ,并直接 link 目标文件或存档。存档只是目标文件的集合,因此您可以互换使用它们。

要为 linker 指定目标文件或存档,请参阅 Linking to an object file. Under Xcode, you add the fully specified archive name (like /usr/local/openssl-ios/lib/libcrypto.a) to Other Linker Flags (the 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).

You use -Wl when the option is passed through the compiler driver to the linker.如果 linker 被直接调用,那么你不需要 -Wl 也不应该使用它。


第二个选项是将 GCC_LINK_WITH_DYNAMIC_LIBRARIES 设置为 YES。 Apple 似乎没有在 Stack Overflow 的 Xcode Build Setting Reference, but its clearly under my copy of Xcode. See How to link a static library for iOS 中记录它。

我好像记得以前遇到过这方面的问题。这是理论上应该可行但在实践中行不通的事情之一。


第三个选项是从 Xcode 下使用的所有路径中删除 dylib 或共享对象,这样 Xcode 在使用 -lcrypto 时不会意外找到它。


第四个选项是使用允许动态 linking,但使用 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 or Gatekeeper Service...

要在 MAC 开发人员计划下对您的库副本进行代码签名,只需:

codesign -fs "Johnny Developer" /usr/local/ssl/lib/libcrypto.so