在XCode中静态链接OpenSSL

在XCode中静态链接OpenSSL,第1张

概述我试图在XCode命令行项目[链接二进制与库]下链接libssl.a和libcrypto.a静态库.我在搜索路径中包含了Openssl头文件. 编译成功但执行失败,dyld:未加载库:/usr/local/ssl/lib/libcrypto.1.0.0.dylib. 当我静态链接它时,为什么它会寻找dylib?怎么解决这个问题? 任何帮助都会很明显. Why does it look for dy 我试图在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
总结

以上是内存溢出为你收集整理的在XCode中静态链接OpenSSL全部内容,希望文章能够帮你解决在XCode中静态链接OpenSSL所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1016042.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存