我正在使用最新版本的Xcode 4开发Cocoa应用程序,我想将动态库链接到我的项目(dylibs
)。
我在某处读到,在我的项目中添加库是不够的,因为我必须运行install_name_tool
和otool
才能使我的项目使用项目中 bundle 的库。
我已经阅读了install_name_tool
的手册页,但是我不明白为什么我必须这样做。
图书馆如何运作?对应用程序和库具有指向我机器中特定位置的路径的部分特别感兴趣,例如运行/usr/local/lib/mylibrary.dylib
时的otool -L
最佳答案
Apple有几种查找共享库的方法:
@executable_path
:相对于主要可执行文件@loader_path
:相对于引用二进制@rpath
:相对于任何路径列表。 @rpath
是OS X 10.5中引入的最新功能。例如,如果您希望将可执行文件包含在
Contents/MacOS
中,将库包含在Contents/Libraries
中,则可以执行以下操作:install_name_tool -id @rpath/Libraries/lib_this.dylib builddir/lib_this.dylib
并在顶级可执行文件中设置
rpath
:install_name_tool -add_rpath @loader_path/.. myexecutable
和:
install_name_tool -change builddir/lib_this.dylib @rpath/Libraries/lib_this.dylib myexecutable
注意:
-change
之后的第一个路径必须与二进制文件中的当前路径完全匹配。如果您迷路了,
otool -l -v myexecutable
会告诉您可执行文件中到底有哪些加载命令。有关更多信息,请参见
man dyld
和man install_name_tool
。关于macos - 为什么Mac Os X中的Mach-O库需要install_name_tool和otool?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9263256/