2015-04-22 120 views
1

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

关于与特定软件包相关的动态库以及如何获取内置于XCode项目中的动态库,还没有一个通用的解释了Mac OS X如何查找动态库以及如何获取新的.dylib到可执行文件的搜索路径中。

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

我在OSX 10.9 - 小牛队。

+0

看到这个问题:http://stackoverflow.com/questions/10359063/dyld-library-not-loaded-opt-local-lib-libglib-2-0-0-dylib?rq=1和Apple主题在其答案中引用:https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/DynamicLibraries/000-Introduction/Introduction.html –

回答

2

一个很好的开始将是苹果的文档Dynamic Library Programming Topics 特别是Run-Path Dependent Libraries

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

先觉得是使用二进制otool检查库的依赖关系为您提供:

otool -L /path/to/binary 

然后,这取决于你想如何分配你的图书馆有不同的解决方案。

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

install_name_tool to change the path to a library by hand. 

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

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

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

+0

我很欣赏链接到动态库编程主题的文章。 'install_name_tool'和我最终做了什么之间的区别是手动建立一个到'/ usr/local/lib /'文件夹中的库的sym链接? – ZacSketches

+0

库的路径是自己写的,这就是为什么你安装之后永远不应该移动dylib。做一个符号链接是骗你的链接器,因为你的dylib有路径问题。它的作品,但它是一个黑客。你可以将你的lib文件夹添加到相应的环境变量中。检查此链接http://superuser.com/questions/282450/where-do-i-set-dyld-library-path-on-mac-os-x-and-is-it-a-good-idea – Kikohs

相关问题