2012-02-13 105 views
31

我正在开发一个使用最新版本的Xcode 4的可可应用程序,我想将动态库链接到我的项目(dylibs)。为什么Mac OS X中的Mach-O库需要install_name_tool和otool?

我读了一些地方,在我的项目中添加库是不够的,因为我必须运行install_name_toolotool以使我的项目使用捆绑在我的项目中的库。

我已阅读手册页面install_name_tool,但我不明白为什么我必须这样做。

图书馆如何工作?运行otool -L

回答

51

苹果的时候特别有兴趣在应用程序和库具有指向特定的地方在我的机器上的路径,像/usr/local/lib/mylibrary.dylib部分具有定位共享库的几种方法:

  1. @executable_path:相对于主可执行文件
  2. @loader_path:相对于所述参照的二进制
  3. @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 dyldman install_name_tool

+0

'otool -L'也有助于显示名称和共享库(您可能希望使用'install_name_tool'更改 – par 2014-02-21 20:48:22

+6

注意:install_name_tool无提示失败;请仔细检查它是否确实按照您的要求执行了操作(使用'otool -L ' – geowar 2014-05-12 18:11:39

+0

似乎dylib中的属性并不重要,它们仅在将可执行文件链接到dylib以将属性从dylib复制到可执行文件时使用。当你已经有一个可执行文件链接到dylib但是你需要改变路径时,那么只需要编辑可执行文件来设置LC_LOAD_DYLIB和LC_RPATH就足够了。第二个只有当第一个文件中有@rpath时才需要它。 – 2017-07-05 11:50:07

相关问题