2011-12-28 60 views
1

我無法讓我的XCode 4.2項目針對動態庫(dynlib)運行。dyld:庫未加載:../lib/abc.dynlib

什麼我做的是添加到庫中的Xcode項目,然後創建與此lib中一個新的「複製文件」構建階段。

該項目不(!)運行良好,如果我在設定的構建階段,以「產品目錄」中的目標,但我必須與應用交付的lib,而不是嵌入了。

我在構建階段的目標的所有其他設置中的標題中出現錯誤。

此外,我試圖退出xcode,刪除生成目錄,乾淨,以及所有這些技巧。

有沒有我缺少的項目/目標設置? 爲什麼XCode在'../lib/'中尋找dynlib? (如錯誤所示)

回答

3

您有兩個選擇a)更改庫ID,b)更改最終產品。

ID嵌入在dylib中,它定義了dyld在哪裏查找它。該ID在鏈接時從庫中獲取(當沒有使用其他特殊標誌時)。您可以用otool -L進行檢查,例如:

gammu:~$ otool -L /usr/lib/libz.dylib 
/usr/lib/libz.dylib: 
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

第一行是dylib的ID。您可以使用install_name_tool -id <path> <library>進行更改。你有一個選擇是使用特殊的形式@executable_path/...它看起來從你的二進制文件的位置(也有其他人)。

第二個選項(實現相同的目的)是將路徑更改爲產品中的庫。你可以檢查它如何鏈接庫具有相同otool -L命令:

gammu:~$ otool -L /usr/bin/emacs 
/usr/bin/emacs: 
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0) 

然後,您可以更改庫與install_name_tool -change <old> <new> <target>,如:

install_name_tool -change ../lib/abc.dynlib @executable_path/../lib/abc.dylib foo 

最後,注意Xcode中通常會自動做這一切爲你如果你讓它管理dylib(而不是手動複製)。

+0

我沒有創建dynlib,所以我無法集成到Xcode中。儘管如此,第二個工作。謝謝! – yzucker

2

我有同樣的問題,並嘗試第一個解決方案,第一個選項不起作用。僅靠第二種選擇無法解決問題。

而是在Xode構建dylib組設置「動態庫安裝名稱」爲「<newpath>/<your.dylib>」。 Newpath是你的目標文件foo可以查看的路徑,並且它將保持你的dylib的路徑。在構建dylib並將其用於構建目標文件之後,這些路徑將自動放入目標文件。

您可以用otool -L確認目標文件和dylib。

0

我有同樣的問題,用這種方式解決:

找到丟失的文件:

mdfind libz.1.dylib 

正是在這裏:/Applications/Vagrant/embedded/lib/libz.1。dylib

將其複製到超級用戶權限缺少的文件夾:

sudo sudo cp /Applications/Vagrant/embedded/lib/libz.1.dylib /usr/lib/libz.1.dylib 

做,一切照常。

相關問題