記錄下筆者源碼編譯 opencv 的過程( Ubuntu 環境下 ),以及某些報錯的解決方法,希望可以幫助有需要的人...
源碼編譯 opencv 的主要流程
1.獲取 opencv 源代碼,用戶可以在 opencv-github 獲取對應版本的 opencv 源代碼,並將其解壓;
upzip opencv-3.2.0.zip -d ~ //解壓 .zip 文件,默認解壓至當前目錄,通過 -d 指定解壓的目標目錄 tar -xvzf opencv-3.2.0.tar.gz -C ~ //解壓 tar.gz 文件,通過 -C 命令解壓至目標目錄
2.進入解壓完成的源碼目錄,並在其中創建一個新的目錄 build,進入該目錄;
cd ~/opencv-3.2.0 //進入解壓好的 opencv 源碼目錄 mkdir build //在源碼目錄中創建新目錄 build cd build //進入 build 目錄
3.使用 cmake 命令生成編譯整個 opencv 項目的 makefile 等內容,並完成對系統環境的檢測,為實際編譯過程確定環境。這一步的 cmake 命令中可以加入很多的編譯選項,來選擇如何對 opencv 源碼進行編譯,如指定那些模塊會被編譯,哪些模塊不進行編譯,以及哪些模塊由於依賴關系未被滿足(如系統上不存在其所需要的相關庫組件等)而無法編譯等。是最重要的一步。如果在使用中只需要使用 opencv 的部分模塊的話,可以在該階段進行指定,進而簡化編譯流程和對系統環境的要求。該步驟所生成的所有信息均存放在之前步驟所新建的 build 目錄下,故而可以通過刪除 build 目錄下的內容來重新執行本步驟。筆者使用的編譯指令如下所示。
cmake -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_opencv_gpu=OFF -DWITH_IPP=OFF -DWITH_CUDA=OFF -DWITH_LAPACK=OFF -DCMAKE_INSTALL_PREFIX=~/opencv_src -DBUILD_TIFF=ON ..
筆者搜集到一些該步驟下可以使用的 cmake 參數,用戶可以根據需要進行使用。
-DCMAKE_INSTALL_PREFIX=/path/to/target/ //編譯完成后 make install 的安裝目錄,默認為 /usr/local/ -DBUILD_opencv_python2=OFF -DBUILD_opencv_python3=OFF //和對應的 python 模塊相關 -DOPENCV_GENERATE_PKGCONFIG=ON -DBUILD_opencv_world=OFF //將所有的動態庫融合為一個 libopencv_world.so 庫 -DOPENCV_EXTRA_MODULES_PATH=/path/to/target/ // 如果需要 opencv contrib 的功能,如人臉識別,則通過該參數指定 contrib 目錄下 module 文件夾的地址
事實上,這些 cmake 的選項基本可以在 opencv 的源碼目錄下的 CMakeLists.txt 中找到。在筆者設備上即為 ~/opencv-3.2.0/CMakeLists.txt 文件。
在執行 cmake 命令完成后,會輸出對環境和編譯模塊的檢測報告,用戶可以從該報告中查看 opencv 編譯環境的相關情況。如在 Opencv modules 部分,可以看到后續會對哪些模塊進行編譯,而哪些模塊無法使用。
4.在 cmake 命令執行成功后,直接通過 make 命令執行編譯過程;
make -j4 //執行 make 開始編譯流程,其中的 -j4 選項指定運行的任務數,可大大加快編譯速度
5.進行安裝操作;
make install //執行安裝操作,會將編譯好庫文件,可執行文件等復制至 CMAKE_INSTALL_PREFIX 指定的目錄
可能的報錯及解決方法:
libzstd.so.1.3.7, needed by /home/xxxxanaconda3/lib/libtiff.so.5
在進行編譯的時候,產生報錯 "libzstd.so.1.3.7, needed by home/xxxx/anaconda3/lib/libtiff.so.5". 當時的報錯的原因在於進行 opencv 編譯的時候,使用了存放在 Anaconda 目錄 anaconda3/lib/ 中的 libtiff.so 庫,原理上其依賴的是同一 anaconda3/lib 目錄下的 libzstd.so 庫文件,而該目錄並不在系統的庫文件搜索路徑中( /etc/ld.so.conf 指定),使得最終產生找不到 libzstd.so 庫的報錯。
解決的方案應該是有兩種,一種首先查看一下當前設備的 Anaconda 安裝目錄中的庫目錄(也就報錯信息中的 /home/xxx/ananconda3/lib/ )中是否存在上述兩個庫,若存在,則將上述兩個庫文件所在的文件夾加入系統的庫文件搜索路徑中即可,這里主要通過環境變量 LD_LIBRARY_PATH 指定。這種方式要確保系統上確實存在某個目錄中存在上述滿足依賴關系的庫文件,如本例中 /home/xxx/anaconda3/lib/ 目錄中即存在 libtiff.so 庫和其所依賴的 libzstd.so 庫。
1)首先通過 grep -E 命令搜索多個字符串結果,筆者的設備上的 ~/anaconda3/lib/ 文件夾中即顯示有 libtiff.so.5 和 libzstd.so.1.3.7. 首先確定對應的目錄下確實包含有上述報無法找到錯誤的庫。
ls ~/anaconda3/lib/ | grep -E "zstd|tiff" //查看用戶主目錄 ~ 下的 anaconda3/lib/ 目錄中是否存在名字帶 zstd 或 tiff 的庫
2) 將上述目錄加入系統庫文件搜索路徑中,通過對環境變量 LD_LIBRARY_PATH 的設置實現
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/xxxx/anaconda3/lib/ //將上述存在 libzstd.so 庫的路徑加入庫文件搜索路徑中
第二種解決方法即 opencv 在進行編譯的時候實際可以選擇不選用系統上的 libtiff.so 庫,而是直接對其所依賴的 tiff 模塊進行編譯,從而避免產生缺少依賴庫的情況。只需在 cmake 階段加入參數 -D BUILD_TIFF=ON 即可。如筆者的 opencv-3.2.0 源碼包中,其目錄 3rdparty 下即包含有 libtiff 的源碼,選擇指定上述選項即使系統通過上述源碼進行編譯。筆者即通過第二種方法解決。
-DBUILD_TIFF=ON // cmake 階段加入該參數,使得 opencv 自行編譯 libtiff.so 等依賴庫,而不依賴使用系統上的已有庫
參考:
complie and link,warning not found libpcre.so.1
ICV: Local copy of ICV package has invalid MD5 hash
-DWITH_IPP=OFF //關閉對 ippicv 模塊的使用
參考:
OpenCV build fails because I cannot download ICV on our build farm——opencv
Why cannot I compile the opencv?——stackoverflow
fatal error: LAPACKE_H_PATH-NOTFOUND/lapacke.h: No such file or directory #include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"
上述報錯的原因為在編譯時的 build 目錄下存在一個 opencv_lapack.h 頭文件,而其中存在語句 #include "LAPACKE_H_PATH-NOTFOUND/lapacke.h“,而實際上系統無法定位得到對應的 lapacke.h 頭文件。搜索的解決方案有兩種,一種即若用戶確定不需要 LAPACK 庫的支持,可以在 cmake 階段使用 -DWITH_LAPACK=OFF 選項關閉 LAPACK 相關的編譯流程,從而避免出現問題(需要重新執行 cmake 指令)。
-DWITH_LAPACK=OFF //關閉對應的 LAPACK 選項
另一種即需要補齊缺失的頭文件,這種方法需要自己具備有安裝依賴的權限。具體而言,可以通過 apt install 安裝對應的 liblapacke-dev 等包,如下命令所示。
sudo apt install liblapacke-dev checkinstall //安裝缺失的依賴庫
在安裝之后,將上述 #include"LAPACKE_H_PATH-NOTFOUND/lapacke.h" 替換為語句 "lapacke.h" 即可完成正確編譯。
參考:
fata error: LAPACKE_H_PATH-NOTFOUND when building OpenCV 3.2
與 contrib 模塊一起編譯時出現 file DOWNLOAD HASH mismatch 的問題
boostdesc_lbgm.i
boostdesc_bgm.i
boostdesc_binboost_064.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_48.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_120.i
另外還有可能遇到 protobuf-cpp-3.1.0.tar.gz 的下載問題,同樣自行下載可以解決,下載地址 https://github.com/google/protobuf/releases/download/v3.1.0/protobuf-cpp-3.1.0.tar.gz ,或者直接網絡搜索 protobuf-cpp-3.1.0.tar.gz download。