1. 程式人生 > >mac : dyld: Library not loaded 問題解決

mac : dyld: Library not loaded 問題解決

在mac中用xcode編寫了一個命令列程式,其中引入了一個framework,最終生成一個可執行程式。

在自己電腦上測試一切正常,可到其他mac中使用此程式,報如下錯誤:

dyld: Library not loaded: /use/lib/lib1

Referenced from: /use/bin/a

Reason: image not found

Trace/BPT trap

從如上錯誤中可以看出為執行時/use/bin/a為該命令列程式或者一個庫,lib1為依賴的庫檔案,即最終動態連結時沒有連結到lib1庫檔案,此時,即使將lib1庫拷貝到程式所在目錄中也不見效。

在xcode中找了好久,檢視是否可以指定庫路徑為相對路徑,沒有找到。後來,一次偶然發現,可以直接改可執行程式依賴的庫,以下為具體方法:

1.檢視/use/bin/a的依賴檔案,在命令列輸入 otool -L /use/bin/a,假設結果如下:

/use/lib/lib1 (compatibility version 0.0.0, current version 0.1.0) 

/use/lib/lib2(compatibility version 0.0.0, current version 0.1.0) 

............(省略其他依賴庫)

從輸出可以看出:在可執行檔案中將依賴檔案寫死為/use/lib/lib1,導致我們將其移植到其他機器中時不太好操作,我們只能在所需移植的機器相同位置安放動態庫檔案,這樣操作顯然不太好。於是,我們可以將路徑改為相對路徑,移植到其他機器中,只需要將可執行檔案和庫放在同一個目錄中,拷貝到其他機器中即可正常執行。

2.修改/use/bin/a的依賴檔案路徑:

install_name_tool -change /use/lib/lib1@executable_path/lib1 /use/bin/a

@executable_path為可執行程式的執行目錄,網上介紹用@loader_path應該也可以

3.重複以上步驟,將依賴的庫均改為相對路徑,並拷貝到一個目錄中組織起來(如果本身就是app,則可以在app包中進行組織)。

注意:一些庫可能仍存在一些依賴關係,操作時需要遞迴地尋找每個庫的依賴關係,並修改路徑,具體做法同上。

4.網上說可以寫個指令碼載入xcode中,具體本人未測試,只是貼出來讓大家看看吧: 在xcode中,展開targets節點,右鍵點工程名稱,在選單中選Add->New Build Phasa->New Run Script Build Phasa,在開啟的對話方塊裡面,把剛才的指令碼貼進去。