當前位置:編程學習大全網 - 源碼下載 - Mac dylib動態庫加載路徑問題(以OpenCV為例)

Mac dylib動態庫加載路徑問題(以OpenCV為例)

在自己的Mac上寫了壹個基於OpenCV的簡單程序;需要傳給其他人***同調試,但是可執行文件在他人的Mac上無法運行;執行時會提示:

這樣就引申出來壹個問題: 在xcode下編譯出的程序,在開發機器上運行是沒有問題的。但是給其他用戶用,就可能出問題。因為用戶不壹定有這個庫。

有兩種方法可以解決這個問題;壹是給其他用戶也安裝依賴的庫文件;二是將所有的dylib隨行發布,消除依賴。

第壹種方案不考慮,大部分時候這樣做並不現實;下面說說如何隨行發布dylib。

單純將依賴的dylib文件拷貝到可執行文件目錄下壹同傳輸過去是不能消除依賴的;執行的時候還是報錯;

在編譯壹個動態庫的時候, 妳需要指定 INSTALL_PATH. 也就是它的安裝路徑;編譯完成後如果壹個可執行程序使用了該動態庫, 那麽在編譯可執行程序的時候, 動態庫的 INSTALL_PATH 會被記錄到可執行程序中, 用來定位這個動態庫。

因此我們首先需要將用到的dylib文件都拷貝到可執行文件目錄下,然後改變動態庫的INSTALL_PATH;將其改到可執行文件所在目錄;

需要註意的是 :如果依賴多個動態庫,用到的動態庫已會依賴其他動態庫,因此用到的所有的動態庫的依賴動態庫路徑都需要修改。

以OpenCV為例子,假設最終編譯出來的可執行文件為 macimgproc ;執行命令: otool -L macimgproc 可看到如下的輸出:

說明macimgproc依賴所有的OpenCV動態庫文件;因此首先需要將所有動態庫文件拷貝到macimgproc所在目錄,然後需要將macimgproc文件中的所有 /usr/local/opt/opencv/lib/libopencv_xxx 修改為 @executable_path/libopencv_xxx ;

@executable_path 表示可執行文件所在目錄;指示所有OpenCV動態庫從可執行文件所在目錄查找;

更多 @executable_path 的介紹以及其他變量參見文章 @rpath, @loader_path, @executable_path 。

使用命令 install_name_tool -change {old.dylib} {new.dylib} {filename} 修改動態庫的INSTALL_PATH,例如:

執行後重新 otool -L macimgproc 可看到如下的輸出:

依次修改所有依賴即可。

整個OpenCV庫大概有19個dylib文件,因此寫了壹個簡單的批量修改腳本:

/openglnewbee/article/details/17783909

如何使用第三方的dylib

@rpath, @loader_path, @executable_path

Apple Developer:Overview of Dynamic Libraries

Apple Developer: Run-Path Dependent Libraries

  • 上一篇:如何解決java中的空指針異常
  • 下一篇:淘口令是什麽?淘口令怎麽設置
  • copyright 2024編程學習大全網