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

我在某处读到,在我的项目中添加库是不够的,因为我必须运行install_name_toolotool才能使我的项目使用项目中 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 dyldman install_name_tool

    关于macos - 为什么Mac Os X中的Mach-O库需要install_name_tool和otool?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9263256/

    10-10 03:10