【问题标题】:dyld: Library not loaded: on OS Xdyld:库未加载:在 OS X 上
【发布时间】:2015-04-22 21:20:08
【问题描述】:

我在 OS X 的命令行中使用 g++ 构建,而不是使用 XCode。当我构建我的可执行文件时,我必须将链接器标志包含到存储动态库的库中,但是当我去运行可执行文件时,找不到动态库,并且出现错误dyld: Library not loaded: (foo)

这里已经有一些关于与特定软件包相关的动态库以及如何将动态库内置到 XCode 项目中的问题,但没有通用解释 Mac OS X 通常如何查找动态库以及如何获得新的.dylib 进入可执行文件的搜索路径。

谁能填补这个空白。当使用可执行文件构建动态库时,Mac OS X 如何查找动态库,我如何将指向动态库的链接放在正确的位置以便可执行文件运行?

我使用的是 OSX 10.9 - Mavericks。

【问题讨论】:

标签: c++ macos


【解决方案1】:

一个好的起点是Dynamic Library Programming Topics 上的 Apple 文档 尤其是Run-Path Dependent Libraries

“当动态加载器 (dyld) 加载可执行文件时,它会按照链接时指定的顺序在运行路径搜索路径中查找运行路径相关库。”

首先想到的是使用 otool 检查二进制文件的库依赖项:

otool -L /path/to/binary

然后,根据您想要分发库的方式,您有不同的解决方案。

您可以在二进制文件中指定库的绝对路径。它应该使用工具来完成,例如 CMake。否则,您可以使用

install_name_tool to change the path to a library by hand.

大多数时候,您希望部署二进制文件并将 dylib 放在单独的文件夹中。这些库是相对于二进制文件所在的位置加载的。 例如:

    @loader_path/../Frameworks/Sparkle.framework/Versions/A/Sparkle

有关路径的更多信息,我建议您阅读this blog

【讨论】:

  • 感谢动态库编程主题文章的链接。 install_name_tool 和我最终做的是手动构建指向 /usr/local/lib/ 文件夹中库的符号链接有什么区别?
  • 库的路径是自己写的,这就是为什么你不应该在安装 dylib 后移动它。做一个符号链接只是欺骗链接器,因为你的 dylib 有路径问题。它有效,但它是一个黑客。不过,您可以将 lib 文件夹添加到相应的环境变量中。检查此链接superuser.com/questions/282450/…
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 2015-02-05
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多