2017-01-21 26 views
2

我在XCode的正確選項中掙扎着在我的應用中包含dylib。我確實在/usr/local/lib中有一個dylib,我確實需要爲我的應用程序。只要我設置路徑庫搜索路徑分佈式dylib的鏈接器設置

enter image description here

一切工作正常。但當然,我要分發與我的應用程序的dylib這就是爲什麼我把它添加到複製階段:

enter image description here

這確實複製dylib到應用程序的文件夾Frameworks。但在目標系統上運行,該應用程序沒有找到dylib。它甚至在/usr/local/lib中找不到它。相反,它嘎嘎叫着:

dyld的錯誤消息:

庫未加載:@是rpath/libopencv_imgproc.3.2.dylib

那麼,哪個選項需要設置?

編輯我整理了一個樣本項目here。它包含3個拉鍊:一個項目,其中一個標題放置在/usr/local/include中,另一個放置在/usr/local/lib中的dylibs。應用程序編譯完成後,應該可以在任何地方運行。 dylib被複制到應用程序中,但在乾淨的機器上運行時,它仍然在/usr/local/lib中尋找dylib。

我試着(太)很多方式來得到這個工作,所以我現在完全混淆了。

+0

您是否在構建階段的'Link Binary with Libraries'中包含'dylib'?我還建議複製'dylib'並將其添加到'Frameworks'文件夾中的項目中,這樣在構建項目時就可以正確設置它。 –

+0

@ l'l l是的,當然。否則編譯將會失敗。複製到項目確實沒有區別。該dylib需要在應用程序內完成上述複製階段。 –

+0

嘗試添加'@ executable_path/Frameworks'來構建設置>鏈接>運行路徑搜索路徑。 –

回答

1

在我之前提到的錯誤消息中,dylib的名稱與您實際使用的名稱不同(3.23.2.0)的名稱不同。由於dylib已經建成,並且您在您的項目中以這種方式包含它,所以現有的rpathid已經存在。

使用otool

$ otool -l libopencv_core.3.2.0.dylib 
... 
Load command 3 
      cmd LC_ID_DYLIB 
     cmdsize 56 
     name @rpath/libopencv_core.3.2.dylib (offset 24) 
    time stamp 1 Wed Dec 31 17:00:01 1969 
     current version 3.2.0 
compatibility version 3.2.0 
... 
Load command 16 
      cmd LC_RPATH 
     cmdsize 32 
     path /usr/local/lib (offset 12) 

有兩件事情可以在這裏觀察;第一個是確認差異的LC_ID_DYLIB,第二,存在的LC_RPATH(rpath)被設置爲表示庫位置是/usr/local/lib。既然你在應用程序中包含lib,它應該被更新。

更新庫(一個包含在你的應用程序):

$ install_name_tool -id @rpath/libopencv_core.3.2.0.dylib libopencv_core.3.2.0.dylib 

更新的LC_ID_DYLIB

$ install_name_tool -add_rpath "@executable/../Frameworks" libopencv_core.3.2.0.dylib 

添加正確的LC_RPATH

$ install_name_tool -delete_rpath "/usr/local/lib" libopencv_core.3.2.0.dylib 

刪除從庫中rpath/usr/local/lib。爲了驗證再次運行otool -l

... 
Load command 3 
      cmd LC_ID_DYLIB 
     cmdsize 64 
     name @rpath/libopencv_core.3.2.0.dylib (offset 24) 
    time stamp 1 Wed Dec 31 17:00:01 1969 
     current version 3.2.0 
compatibility version 3.2.0 
... 
Load command 17 
      cmd LC_RPATH 
     cmdsize 40 
     path @executable/../Frameworks (offset 12) 

現在你應該可以包括在獨立的應用程序的dylib,它的路徑應設置正確;更新的dylibhere。更新庫後,應用程序可以毫無問題地打開。

注:在你的問題要導入libopencv_core3.2.0.dylib,雖然錯誤狀態libopencv_imgproc.3.2.dylib,但我相信它的另一個dylib其遭受類似的問題,所以這當然可以被應用到其他。該rpath你原本在Xcode中設置是正確的

enter image description here

雖然因爲庫允許多個rpaths存在,/usr/local/bin已經存在它的使用位置首先,除了錯誤的名稱。

+1

非常好,我不知道這些內部結構,但現在我看到了問題的來源。其他庫需要類似的調整。非常感謝您的時間! –

+0

非常感謝(意外的)賞金托馬斯!它真的讓我的一天,歡呼! :) –

+0

你讓我的一天:-) –