在XCode中静态链接OpenSSL

在XCode中静态链接OpenSSL,xcode,openssl,static-linking,dylib,Xcode,Openssl,Static Linking,Dylib,我正在尝试链接XCode命令行项目中的libssl.a和libcrypto.a静态库[链接二进制库下]。我已经在搜索路径中包含了Openssl头文件 编译成功,但执行失败,未加载dyld:Library:/usr/local/ssl/lib/libcrypto.1.0.0.dylib 当我静态链接它时,为什么它会寻找动态库?如何解决这个问题 任何帮助都是值得的 当我静态链接它时,为什么它会寻找动态库?如何解决这个问题 苹果的链接器使用动态库或共享对象(如果可用),而不考虑链接器标志,如-rpat

我正在尝试链接XCode命令行项目中的
libssl.a
libcrypto.a
静态库[链接二进制库下]。我已经在搜索路径中包含了Openssl头文件

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

当我静态链接它时,为什么它会寻找动态库?如何解决这个问题

任何帮助都是值得的

当我静态链接它时,为什么它会寻找动态库?如何解决这个问题

苹果的链接器使用动态库或共享对象(如果可用),而不考虑链接器标志,如
-rpath
-Bstatic
。他们甚至在iOS上这样做,在iOS上不允许动态库

这是一个众所周知的问题,一旦你了解它:)看,例如。Crypto++与苹果的工具有同样的问题

修复方法是停止使用
-L
-L
选项,并直接链接对象文件或存档。归档只是对象文件的集合,因此您可以互换使用它们

要指定链接器的对象文件或存档,请参见。在Xcode下,将完全指定的存档名称(如
/usr/local/openssl ios/lib/libcrypto.a
)添加到其他链接器标志(Xcode选项)

在将完整存档添加到
其他\u LDFLAGS
时,我相信您只需逐字添加它,而不使用任何开关,如
-l
-l
。您可能需要
-Wl
-Wl,/usr/local/openssl ios/lib/libcrypto.a
),但您不使用
-l
-l/usr/local/openssl ios/libcrypto.a

当选项通过编译器驱动程序传递到链接器时,使用
-Wl
。如果直接调用链接器,则不需要
-Wl
,也不应使用它


第二个选项是将带有动态库的
GCC\u LINK\u设置为
YES
。苹果似乎并没有将其记录在文档中,但它显然在我的Xcode副本下。请参阅关于堆栈溢出的说明

我似乎记得过去在这方面有过问题。这是理论上应该可行,但在实践中却行不通的事情之一


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


第四个选项是使用允许动态链接,但使用执行程序。它的OSX相当于
LD_LIBRARY_PATH
,确保加载OpenSSL副本(如1.0.2),而不是系统版本的OpenSSL(0.9.8)

但我不喜欢这个选项,因为它要求软件用户做一些事情


由于消息
dyld:Library not loaded:/usr/local/ssl/lib/libcrypto.1.0.0.dylib
的另一种可能性是对库的副本进行代码签名。这有点奇怪,它被找到了,但没有加载,所以我打算把它扔出去,以防它的OSX或

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

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

Anil-这是iOS、OS X还是两者都有?非常感谢。1) 如果我在其他链接器标记中使用-Wl、$path_to_lib.a,即使我从“linkbinary With Library”中删除了库,它也可以工作。这怎么可能呢?我希望预装在MAC上的openssl不会干扰?2) 默认情况下,MAC-OSX上是否始终安装openssl?如果是这样的话,如果我们直接使用它(使用NSTask),而不涉及静态或动态链接的复杂性,会有什么不同吗?它选择了正确的版本。我已经构建了静态库版本1.0.2a,SSLeay_版本的输出是1.0.2a 19 Mar。如果始终预装openssl,那么我们可以通过NSTask直接调用openssl函数,而无需将其与项目链接。“1.0.2a 19 Mar”-1.0.2c是最新版本,并且有安全漏洞修复。“如果预先安装了openssl,这有意义吗…”苹果的openssl版本是0.9.8。它缺乏大多数EC支持,TLS 1.1和TLS 1.2(以及其他支持)。你可能应该避免。“这怎么可能呢?”-哦,我的错。。。是的,行得通。它之所以有效,是因为您正在为链接器指定要链接到的对象文件。归档只是对象文件的集合。即使使用了这种技巧,也要确保使用
-I..
来指定特定库的头文件。从Xcode 9升级到Xcode 10后,我也遇到了类似的问题。我的iOS应用程序生成并启动,但我在启动openssl.framework时遇到一个dyld错误
找不到图像
??我应该提到,升级Xcode 10(Swift 4.2)需要
pod repo更新
pod安装