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

Ale*_*lex 36 macos mach-o otool install-name-tool

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

我读的地方,在我的项目库添加是不够的,因为我有运行install_name_tool,并otool让我的项目中使用我的项目被捆绑的库.

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

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

Wil*_*eld 61

Apple有多种方法可以找到共享库:

  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
Run Code Online (Sandbox Code Playgroud)

并在顶级可执行文件集中rpath:

install_name_tool -add_rpath @loader_path/..  myexecutable
Run Code Online (Sandbox Code Playgroud)

和:

install_name_tool -change builddir/lib_this.dylib @rpath/Libraries/lib_this.dylib myexecutable
Run Code Online (Sandbox Code Playgroud)

注意:后面的第一个路径-change必须与二进制文件中当前的路径完全匹配.

如果您迷路了,otool -l -v myexecutable将告诉您当前在可执行文件中的加载命令.

请参阅man dyldman install_name_tool了解更多信息.

  • 注意:install_name_tool无提示失败; 总是仔细检查它实际上做了你告诉它做的事情(使用'otool -L <path_to_dylib>'. (6认同)

Kon*_*zus 8

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