2013-02-18 47 views
2

我已經使用GPhoto2 Framework編寫了一個簡單的應用程序,只要框架位於最初編譯的位置,它就可以工作。不過,我想將它放入應用程序包中,因此它不需要單獨安裝,所以我需要使其與此主要可執行文件相關。忽略install_name_tool將框架私有化

不幸的是,框架不是Xcode項目。它使用腳本來構建,因此我不能簡單地更改安裝目錄構建設置,這是我在搜索答案時經常看到的解決方案。作爲Xcode和Mac編程的新手,我無法知道如何將框架轉換爲Xcode項目。

我遇到的其他建議是使用install_name_tool來更新庫ID和依賴關係,用「@executable_path /../ Frameworks/GPhoto2.framework」形式替換絕對路徑。該框架不是一個單一的二進制文件,但包含一些.dylib和.so庫,但更新所有這些只有一半成功。

我已經設置了Xcode,當它構建它時將框架複製到應用程序包中。然後,如果我從最初編譯的位置刪除框架,應用程序將無法加載,OS X生成的報告稱,libgphoto2庫不能再被找到,這是預料之中的。

如果我然後使用install_name_tool更新應用程序包內的所有框架庫中的引用,並且也在應用程序二進制文件本身中,則應用程序將加載,但無法找到連接的任何相機。使用otool我能夠驗證所有引用已正確更改。

但是,如果我將框架的副本替換爲其原始位置,它將再次正常工作,識別連接的攝像頭,而不管該框架是使用相對位置還是絕對位置。顯然它仍然在看這個位置,儘管加載。我甚至嘗試從原始位置的框架中依次移除每個單獨的庫文件,以查看問題是否僅僅是依賴於這些文件的結果,但不管缺失哪個應用程序都不起作用。順便說一句,如果我使用框架的更新版本構建應用程序,它會失敗,說它找不到庫「@executable_path /../ Frameworks/GPhoto2.framework/prefix/lib/libgphoto2.2.dylib」

我做錯了什麼或錯過了一個步驟,或者是我正在嘗試做的不可能在Xcode之外創建的框架嗎?

+0

經過進一步檢查,我發現了具體的問題。當我通過文件測試來完成我的文件以查看原始框架位置中需要的內容時,我不幸遇到了一個硬編碼路徑。所以私人框架加載了一些硬編碼的依賴關係,給出了一個需求的錯誤印象。 – Michael 2013-02-18 11:48:30

+0

抱歉,從未意識到的評論不能包含新行。 再次測試原始位置的唯一要求是.so文件,使用字符串我可以確認它們的位置被硬編碼到某些庫中。 有沒有官方的方式能夠更新這些?如果沒有,是否有可能用二進制編輯器覆蓋相對路徑的路徑,並在這種情況下相對於什麼? – Michael 2013-02-18 11:56:08

回答

0

如果有人遇到這個未來,我的問題的答案是我沒有做錯什麼。問題是.so文件正在被libtool ltdl加載,因爲它需要絕對路徑,所以這些文件是在構建時設置的。

我修補了文件gphoto2-abilities-list.c和gphoto2-port-info-list.c,以便在運行時它將相關庫路徑與可執行位置結合起來。因此,我還需要增加FILENAME_MAX常數以允許郵件應用程序從例如桌面運行。但是,隨着install_name_tool的使用,我可以將GPhoto2作爲框架添加到應用程序中,而不需要任何外部依賴。

使用install_name_tool後,仍然無法使用框架在XCode中構建我的應用程序的最後一個問題仍然存在,但爲此我只使用原始框架構建,然後在編譯後更新了複製框架中的引用我更新了主要可執行文件的時間。