2012-11-21 67 views
1
install_name_tool -change /usr/local/lib/testlib.dylib "$TARGET_BUILD_DIR"/../../testlib.dylib "$PRODUCT_NAME" 

我被告知上述情況時,將其放入xcode的運行腳本中會改變動態庫的查找路徑。這可以然後通過輸入以下到一個終端窗口使用install_name_tool更改dylib的路徑

otool -L /drag/the/executable/here/and/its/filepath/will/show/up/testlib 

輸出進行驗證將會像下面

/previous/filepath: 
/usr/local/lib/testlib.dylib (compatibility version 1.0.0, current version 1.0.0) 
./anothertestlib.dylib (compatibility version 1.0.0, current version 1.0.0) 
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0) 

我的問題是,爲什麼會不install_name_tool命令?現在不是這樣,但是當testlib項目是客戶項目的目標依賴時,它就這樣做了。現在我只是將.dylib拖入客戶端項目中。查找路徑停留在usr/local/lib中。

而且,什麼是usr/local/lib,爲什麼系統認爲我的dylib在那裏,它是如何進入的?

回答

1

install_name_tool通過覆蓋路徑字符串來工作,所以任何新的必須與原始字符串相同或更短。

因爲 「/usr/local/lib/testlib.dylib」 是28個字符,並且 「」 $ TARGET_BUILD_DIR 「/../../ testlib.dylib」 至少是20個字符長,如果$ TARGET_BUILD_DIR可變擴展爲9個或更多字符的字符串,則替換可能會太長以至於無法使用。

我說可能是因爲你可以添加flag -headerpad_max_install_names到鏈接器,這樣它會在每個路徑後添加填充,所以空間將存在以允許更長的替換(我相信最多1,024個字符)。雖然作爲install_name_tool失敗,那麼這可能不會被使用。

對於/ usr/local/lib路徑,技術上/ usr(/ usr/bin,/ usr/lib等)適用於適用於任何機器並可安裝在網絡上的軟件,/usr/local根目錄(/ usr/local/bin,/ usr/local/lib)適用於本地機器的任何特定用途。實際上,更多的情況是,通過OS分發用戶/ usr提供的軟件包以及定製安裝use/use/local。大多數情況下,這並不重要。在Mac上,Homebrew軟件包管理器使用/ usr/local根目錄(而MacPorts使用/ opt和Fink/sw)。

剛剛發生的事情是,無論您最初安裝的是否使用了其他任何選項的位置。但只要需要它知道去哪裏看,它就不是一個或多或少的有效位置。