gpt4 book ai didi

xcode - 在 XCode 中静态链接 OpenSSL

转载 作者:行者123 更新时间:2023-12-04 23:19:41 27 4
gpt4 key购买 nike

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

编译成功但执行失败 dyld: Library not loaded: /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 或共享对象(如果可用),无论您的链接器标志如何,如 -rpath-Bstatic .他们甚至在不允许使用 dylib 的 iOS 上执行此操作!

一旦你知道它,它就是一个众所周知的问题:) 例如,参见 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_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 when the option is passed through the compiler driver to the linker.如果直接调用链接器,则不需要 -Wl并且不应该使用它。

第二个选项是设置 GCC_LINK_WITH_DYNAMIC_LIBRARIESYES . Apple 似乎没有在 Xcode Build Setting Reference 中记录它,但它显然在我的 Xcode 副本下。见 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: Library not loaded: /usr/local/ssl/lib/libcrypto.1.0.0.dylib 引起的另一种可能性是对您的库副本进行代码签名。它找到了但没有加载有点奇怪,所以我要把它扔出去以防它的 OS X 的 Code SigningGatekeeper Service ...

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

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

关于xcode - 在 XCode 中静态链接 OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30943817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com