dyld:未加载库:在OS X上

Zac*_*hes 1 c++ macos

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

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

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

我在OSX 10.9-小牛上。

Kik*_*ohs 5

一个不错的起点是有关动态库编程主题 ,特别是与运行路径相关的库的Apple文档。

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

首先想到的是使用otool为您检查二进制库的依赖关系:

otool -L /path/to/binary
Run Code Online (Sandbox Code Playgroud)

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

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

install_name_tool to change the path to a library by hand.
Run Code Online (Sandbox Code Playgroud)

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

    @loader_path/../Frameworks/Sparkle.framework/Versions/A/Sparkle
Run Code Online (Sandbox Code Playgroud)

有关路径的更多信息,建议您阅读此博客