2009-08-20 100 views
4

我的Mac OS應用程序與非系統提供的框架Foo.framework鏈接。我在XCode中添加了對框架的引用,並且應用程序可以正常工作。我也有一個規則將框架複製到輸出框架文件夾(MyApp.app/Contents/Frameworks)中。但是,在運行時,二進制文件正在尋找〜/ Library/Frameworks中的框架,並且應用程序無法加載。OSX:改變.framework的路徑

otool -l MyApp.app還告訴我,它的尋找/用戶//庫/框架的框架。

有人可以解釋爲什麼發生這種情況,和什麼是正確的方式,使應用程序的外觀在應用程序捆綁的框架文件夾?

我哈克的解決辦法是包括自定義腳本來更改使用install_name_tool在Mach-O的二進制文件的路徑,但我敢肯定有這樣做的清潔方式。

回答

6

你在正確的軌道上。

這是因爲在OS X在創建時的"install_name"被記錄在庫中。然後將install_name複製到與其鏈接的任何應用程序。

解決此問題的「最佳」方法是修改框架的源代碼,以便在構建框架時設置鏈接器標記。

然而,這往往不可能的,要麼是因爲你沒有來源,或框架有autoconf的東西,使得它幾乎不可能一個巨大的混亂。在這種情況下,使用帶-id標誌的install_name_tool來更改庫中記錄的install_name

所以,說了這麼多,你怎麼將其更改爲?

@executable_path /../框架/ Foo.framework /美孚(或任何名稱)

所以,從含有Foo.framework的目錄:

install_name_tool -id @executable_path/../Frameworks/Foo.framework/Foo Foo.framework/Foo 

在運行時,裝載機將解析@executable_path到應用程序可執行文件的路徑。很明顯,您還需要設置「複製文件」構建階段以將框架複製到應用程序包的Framework文件夾中。

您還可以使用帶-change標誌的install_name_tool在庫已經鏈接到應用程序後更改庫的install_name,但這顯然不是最理想的。在鏈接之前修復它。

+0

好吧 - 這正是我一直在做的。感覺破裂了。我想要Apple可以向XCode添加一些東西,它允許開發人員在指定新的框架時設置運行時路徑。 – psychotik 2009-08-20 06:24:17