2010-01-19 76 views
13

我正在創建一個取決於其他幾個庫的插件應用程序(dylib)。這些其他庫安裝在我的系統上,但不保證安裝在任何用戶的系統上。所以我需要找到一種方式將依賴與我的應用程序捆綁在一起。MacOSX:如何將依賴關係收集到本地包中?

我發現我可以使用otool來列出或更改其他dylib的路徑。這將允許創建一個捆綁我的插件應用程序和所有需要的依賴關係的文件夾。

但是,手動執行此操作看起來像是一項耗時且笨拙的任務。是否有可用的實用程序來自動化它?

或者我做錯了,這個問題有更好更明顯的方法嗎?

編輯 我創建了一個script,自動化大部分任務。

回答

14

使用install_name_tool在您的dylib中使用相對路徑。這樣,您可以將它們設置一次,並在任何地方安裝該目錄,而無需在安裝時修改您的庫。

您應該將所有的dylib依賴關係放入一個文件夾,然後使用install_name_tool來設置您所依賴的其他dylib的相對位置。假設你的庫libmyfoo.dylib取決於libbar.dylib:

install_name_tool -change "/Whatever/full/path/libbar.dylib" "@loader_path/libbar.dylib" libmyfoo.dylib 

這樣,你的圖書館總是會libbar.dylib在libmyfoo.dylib所在的同一目錄中。

您可能還需要在某些其他dylib上運行install_name_tool(如果它們互相依賴)。

當心,爲install_name_tool的文件指出,「對於這個工具,當安裝名稱或rpaths較大二進制應與LD建工作(1)-headerpad_max_install_names選項。」,所以一定要包括構建庫時的命令行選項-headerpad_max_install_names

@loader_path是相對於用來加載dylib的二進制文件,在這種情況下是您的libmyfoo.dylib。如果您想查找與啓動庫加載順序的可執行文件相關的庫,請使用@executable_path

+0

請注意,這是一個自動接受的賞金答案。據推測,這實際上並沒有解決提問者的問題。 – 2010-02-03 22:02:16

3

Macdylibbundler是一個方便的小工具,它究竟是幹什麼的要求。當爲OSX分發二進制文件時,它確實挽救了我的生命。

相關問題