2013-11-04 114 views
5

我是這個領域的新手。我的筆記本電腦是Macbook air,軟件:OS X 10.8.5(12F45)。我正在運行一個代碼,它給了我以下錯誤:錯誤:dlopen()庫未加載原因:找不到圖像

dlopen(/Users/ramesh/offline/build_icerec/lib/icecube/phys_services.so, 2): Library not loaded: /Users/ramesh/offline/build_icerec/lib/libphys-services.dylib Referenced from: /Users/ramesh/offline/build_icerec/lib/icecube/phys_services.so Reason: image not found

我沒有谷歌搜索,並找到各種答案。我認爲工作的一個方法是使用

" -install_name @rpath/lib ".

我的問題是,如何在我的情況下使用-install_name @rpath/lib

+0

在安裝xcode 8之後,在ruby中使用binding.pry時,我遇到了同樣的問題。重新安裝紅寶石之後,一切正常。看起來比複雜,但麻煩正確的答案更容易。 'rvm requirements'也幫助我,因爲我最近更新了我的系統。 – Johannes

回答

13

OS X下的共享對象位置有時很棘手。當你直接呼叫dlopen()時,你可以自由指定圖書館的絕對路徑,這很好。然而,如果你加載一個庫,而這個庫又需要加載另一個庫(看起來是你的情況),那麼你就失去了控制,指定圖書館的直接路徑。

有一些環境變量,你可以在之前設置運行你的主程序,告訴動態加載器在哪裏搜索東西。一般來說,這些都不是好主意(但您可以通過OS X系統上的man dyld命令來了解它們)。

當創建OS X動態庫時,會給出安裝名稱;該名稱嵌入在二進制文件中,可以通過otool命令查看。 otool -L mach-o_binary將列出您提供文件名的mach-o二進制文件的動態庫引用;例如,這可以是主要的可執行文件或dylib。

當一個動態庫靜態鏈接到另一個可執行文件(主要可執行文件或另一個dylib)時,該dylib被鏈接到的位置的預期位置是基於寫入它的位置(當它或者之後應用的更改)。在你的情況下,phys_services.so似乎與libphys-services.dylib靜態鏈接。所以要開始,運行otool -L phys_services.so找到精確期望dylib將在哪裏。可以使用install_name_tool命令來更改庫的預期位置。它可以在dylib與靜態鏈接之前運行(在這種情況下,你沒有什麼可以做的),或者它可以針對裝載它的可執行文件運行,以便重寫這些期望。這種命令模式爲install_name_tool -change <old_path> <new_path>因此,例如,如果otool -L phys_services.so顯示您/usr/lib/libphys-services.dylib,並且您希望移動問題中提出的期望值,則可以使用install_name_tool -change /usr/lib/libphys-services.dylib @rpath/lib/libphys-services.dylib phys_services.so來執行此操作。

dyld手冊頁(man dyld)會告訴您如何使用@rpath以及其他宏@loader_path和@executable_path。

+0

您也可以嘗試將'-Wl,-rpath,$ {RPATH}'選項傳遞給鏈接器,其中'$ {RPATH}'是庫的路徑,如'/ foo/bar/lib'。可以指定幾個這樣的選項,鏈接器將搜索所有這些位置的動態庫。 –

相關問題