2012-02-13 103 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

相關問題