加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在XCode中静态链接OpenSSL

发布时间:2020-12-14 17:43:39 所属栏目:百科 来源:网络整理
导读:我试图在XCode命令行项目[链接二进制与库]下链接libssl.a和libcrypto.a静态库.我在搜索路径中包含了Openssl头文件. 编译成功但执行失败,dyld:未加载库:/usr/local/ssl/lib/libcrypto.1.0.0.dylib. 当我静态链接它时,为什么它会寻找dylib?怎么解决这个问题
我试图在XCode命令行项目[链接二进制与库]下链接libssl.a和libcrypto.a静态库.我在搜索路径中包含了Openssl头文件.

编译成功但执行失败,dyld:未加载库:/usr/local/ssl/lib/libcrypto.1.0.0.dylib.

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

任何帮助都会很明显.

解决方法

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

Apple的链接器使用dylib或share对象(如果可用),无论您的链接器标志如-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 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 ).

当选项通过编译器驱动程序传递给链接器时,可以使用-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:未加载库:/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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读