在XCode中静态链接OpenSSL

Zes*_*est 4 xcode openssl dylib static-linking

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

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

当我静态链接它时,为什么它会寻找dylib?怎么解决这个问题?

任何帮助都会很明显.

jww*_*jww 8

当我静态链接它时,为什么它会寻找dylib?怎么解决这个问题?

苹果的连接器使用如果可用的dylib或共享对象,不管你的连接标志喜欢的-rpath-Bstatic.他们甚至在iOS上进行,不允许使用dylib!

一旦你了解它就是一个众所周知的问题:)例如,请参阅在Mac OS X上安装Crypto ++ 5.6.2.Crypto ++与Apple的工具有同样的问题.

修复方法是停止使用-L-l选项,以及直接链接目标文件或存档.存档只是目标文件的集合,因此您可以互换使用它们.

要指定链接器的目标文件或存档,请参阅链接到目标文件.在Xcode下,您将完全指定的存档名称(如/usr/local/openssl-ios/lib/libcrypto.a)添加到Other Linker Flags(OTHER_LDFLAGSXcode选项).

添加完整档案时OTHER_LDFLAGS,我相信你只需逐字添加,无需任何开关,如-l-L.您可能需要-Wl(-Wl,/usr/local/openssl-ios/lib/libcrypto.a),但使用-l(-l/usr/local/openssl-ios/lib/libcrypto.a).

您可以使用-Wl时,选择是通过编译器驱动程序的链接通过.如果直接调用链接器,那么您不需要也不-Wl应该使用它.


第二个选项是设置GCC_LINK_WITH_DYNAMIC_LIBRARIESYES.Apple似乎没有在Xcode Build Setting Reference中记录它,但它显然在我的Xcode副本下.请参阅如何在Stack Overflow上链接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的代码签名关守服务 ......

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

codesign -fs "Johnny Developer" /usr/local/ssl/lib/libcrypto.so
Run Code Online (Sandbox Code Playgroud)