Xcode 8出现"Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib"的问题?

4

我的项目需要OpenSSL库的cryptossl模块。在将Xcode更新到8.2.1版本后,编译我的项目失败了。

在我的项目构建设置中,在链接选项中,我添加了-lssl -lcrypto -lxml2以指示加载这些库。回到我的应用程序构建设置中,我在库搜索路径中添加了/usr/local/opt/openssl/lib/来告诉Xcode在哪里查找。

太棒了,它可以正常编译、构建和运行。很酷。

但是

在不同的Mac上启动应用程序时,应用程序崩溃,并显示以下链接错误:

Dyld Error Message:
  Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /Applications/MyApp.app/Contents/MacOS/MyApp
  Reason: image not found

这意味着该应用程序正在尝试加载可能不存在于该Mac上的open ssl库。可能只有旧版本,或者该文件夹根本不存在?因此,这肯定不是解决方案。

我的问题在于,我不知道如何解决这个问题。

从链接中删除-lssl -lcrypto并不能帮助解决问题,因为在链接过程中出现了错误。

我猜我需要一种方法来告诉Xcode仅在编译时查找那里。那是可能的吗?


也许你应该将更新的 libssl.dyliblibcrypto.dylib 包含在你的应用程序包中。这似乎可以解决 Reason: image not found 的问题。同时,参考 Using Dylibs Inside App BundleIncluding dylib in application bundle - jww
@jww 我可以将 dylib 添加到我的应用程序包中,但主要问题仍然存在。在编译时,我需要在库搜索路径 /usr/local/opt/openssl/lib 中指定 openssl 的路径,以便编译成功。但是,在启动应用程序时,它会搜索在 /usr/local/opt/openssl/lib 找到的 dylib,即 /usr/local/opt/openssl/lib/libssl.1.0.0.dylib(我猜它只是搜索编译时找到的 dylib)。如何告诉应用程序加载嵌入的 dylib 而不是寻找 /usr/local/opt/openssl/lib/ 中的 dylib?这是否可能? - Link14
@jww 又发现了一件奇怪的事情。我在 /usr/lib 中找到了另一个 libssl.dyliblibcrypto.dylib。但是当我将该路径添加到库搜索路径中时,编译命令会将其丢弃,它似乎没有被使用。 - Link14
我可以将dylibs添加到我的应用程序包中,但主要问题仍然存在。看起来你需要运行install_name_tool来取消硬编码路径/usr/local/opt/openssl/lib。也许你应该将它相对于应用程序进行设置。我认为你可以在预构建脚本或预构建阶段完成这个操作。 - jww
1
@JamesRisner 这个问题已经发布了5年,不幸的是我不再能够访问那个项目并测试你的解决方案。 - Link14
1个回答

0

如果您不想要打包库并且处理确保链接器可以找到它们的问题,您可以将代码与静态库进行链接。

使用此问题中的代码作为链接示例,我使用以下命令进行编译:

cc -I/opt/homebrew/Cellar/openssl@1.1/1.1.1q/include -o Link14 Link14.cpp /opt/homebrew/Cellar/openssl@1.1/1.1.1q/lib/libcrypto.a -lc++

大多数情况下使用系统库,但在加密方面使用 libcrypto.a 中的静态版本。您可以通过将它们放置在编译/链接行上来添加多个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接