dyld:未加载库:在 OS X

dyld: Library not loaded: on OS X

我在 OS X 中从命令行使用 g++ 进行构建,而不是使用 XCode。当我构建可执行文件时,我必须将 linker 标志包含到存储动态库的库中,但是当我转到 运行 可执行文件时,找不到动态库,我得到了错误 dyld: Library not loaded: (foo)

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

有人可以填补这个空白吗?当使用可执行文件构建动态库时,Mac OS X 如何查找动态库?我如何将 link 放到我的动态库的正确位置,以便可执行文件将 运行?

我在 OSX 10.9 - 小牛队。

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

"When the dynamic loader (dyld) loads the executable, it looks for run-path dependent libraries in the run-path search paths in the order in which they were specified at link time."

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

otool -L /path/to/binary

然后,根据您希望如何分发库,您有不同的解决方案。

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

install_name_tool to change the path to a library by hand.

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

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

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