编译成功但执行失败,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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)