我正在开发一个使用最新版本的Xcode 4的可可应用程序,我想将动态库链接到我的项目(dylibs
)。为什么Mac OS X中的Mach-O库需要install_name_tool和otool?
我读了一些地方,在我的项目中添加库是不够的,因为我必须运行install_name_tool
和otool
以使我的项目使用捆绑在我的项目中的库。
我已阅读手册页面install_name_tool
,但我不明白为什么我必须这样做。
图书馆如何工作?运行otool -L
我正在开发一个使用最新版本的Xcode 4的可可应用程序,我想将动态库链接到我的项目(dylibs
)。为什么Mac OS X中的Mach-O库需要install_name_tool和otool?
我读了一些地方,在我的项目中添加库是不够的,因为我必须运行install_name_tool
和otool
以使我的项目使用捆绑在我的项目中的库。
我已阅读手册页面install_name_tool
,但我不明白为什么我必须这样做。
图书馆如何工作?运行otool -L
苹果的时候特别有兴趣在应用程序和库具有指向特定的地方在我的机器上的路径,像/usr/local/lib/mylibrary.dylib
部分具有定位共享库的几种方法:
@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
N ote:-change
之后的第一条路径必须完全匹配二进制文件中当前的内容。
如果您迷路了,otool -l -v myexecutable
会告诉您哪些加载命令完全在可执行文件中。
有关更多信息,请参见man dyld
和man install_name_tool
。
还有一个名为MacDependency的GUI工具,它将公开所有依赖库(https://github.com/kwin/macdependency/)。
'otool -L'也有助于显示名称和共享库(您可能希望使用'install_name_tool'更改 – par 2014-02-21 20:48:22
注意:install_name_tool无提示失败;请仔细检查它是否确实按照您的要求执行了操作(使用'otool -L' –
geowar
2014-05-12 18:11:39
似乎dylib中的属性并不重要,它们仅在将可执行文件链接到dylib以将属性从dylib复制到可执行文件时使用。当你已经有一个可执行文件链接到dylib但是你需要改变路径时,那么只需要编辑可执行文件来设置LC_LOAD_DYLIB和LC_RPATH就足够了。第二个只有当第一个文件中有@rpath时才需要它。 – 2017-07-05 11:50:07