为什么Mac OS X中的Mach-O库需要install_name_tool和otool?

时间:2012-02-13 15:37:13

标签: macos mach-o otool install-name-tool

我正在使用最新版本的Xcode 4开发Cocoa应用程序,我想将动态库链接到我的项目(dylibs)。

我在某处读到在我的项目中添加库是不够的,因为我必须运行install_name_toolotool才能使我的项目使用我项目中捆绑的库。

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

图书馆如何运作?特别感兴趣的是应用程序和库具有指向我机器中特定位置的路径的部分,例如/usr/local/lib/mylibrary.dylib时运行otool -L

2 个答案:

答案 0 :(得分:58)

Apple有几种查找共享库的方法:

  1. @executable_path:相对于主要的可执行文件
  2. @loader_path:相对于引用二进制文件
  3. @rpath:相对于任何路径列表。
  4. @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 dyldman install_name_tool

答案 1 :(得分:8)

还有一个名为MacDependency的GUI工具,它将公开所有依赖库(https://github.com/kwin/macdependency/)。