cmake linux模板 多目錄_Ubuntu16.04非root使用者安裝OpenCV4並使用g++/CMake編譯
技術標籤:cmake linux模板 多目錄
前言
今天使用C++寫了一個簡單的程式,程式碼中呼叫了OpenCV庫函式。在本機macOS下環境搭建比較順利,而放到伺服器上時由於沒有root許可權,無法使用apt-get,無法使用sudo,網上的大多數教程無法照搬,在搭建OpenCV環境時遇到了一些小坑。經過不斷的踩坑終於配好了環境,特此記錄一下。
安裝CMake
首先下載CMake,如果wget
太慢建議本地下載後上傳至伺服器。
wget https://cmake.org/files/v3.17/cmake-3.17.0-Linux-x86_64.tar.gz
解壓。
tar zxvf cmake-3.17.0-Linux-x86_64.tar.gz
開啟.bashrc。
vim ~/.bashrc
修改環境變數,新增的路徑為剛剛解壓後的路徑。
export PATH=/home/fangqingkai/cmake-3.17.0-Linux-x86_64/bin:$PATH
source
一下使剛剛的配置生效。
source ~/.bashrc
測試一下,大功告成。
(base) [email protected]:~/cmake-3.17.0-Linux-x86_64/bin$ cmake --version cmake version 3.17.0 CMake suite maintained and supported by Kitware (kitware.com/cmake).
安裝OpenCV
首先下載OpenCV原始碼,我下載的是最新的OpenCV4.2.0版本,解壓。
unzip opencv-4.2.0.zip
建立工作資料夾。
cd opencv-4.2.0/
mkdir build
cd build/
下面是最關鍵的一步,需要注意的兩點:①設定OPENCV_GENERATE_PKGCONFIG=YES
,這是由於在OpenCV4中,預設關閉了生成opencv.pc
檔案的選項,這會導致在使用g++編譯時,通過pkg-config
無法找到OpenCV的庫檔案。②設定CMAKE_INSTALL_PREFIX
為使用者目錄,由於我們是非root使用者,只能將其安裝在使用者目錄下,否則後面安裝時會由於許可權不足而導致錯誤。
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=/home/fangqingkai/ ..
在執行cmake
的過程中,需要下載一個檔案ippicv_2019_lnx_intel64_general_20180723.tgz
,由於伺服器上網速可能較慢,可以先手動下載該檔案,並將其上傳到伺服器,我將其放在了使用者主目錄下。接下來需要修改OpenCV的配置檔案,將該檔案47行的"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}ippicv/"
修改為"file:~/"
,即使用者主目錄。這樣速度就快多了。
vim ~/opencv-4.2.0/3rdparty/ippicv/ippicv.cmake
接下來編譯安裝即可。
make -j8
make install
到此為止如果沒有出錯,OpenCV就安裝完了,並且可以使用CMake來編譯運行了,而如果要使用g++編譯,還需要對pkg-config
進行進一步的配置。
配置pkg-config
pkg-config
的作用,簡而言之就是在編譯時尋找庫檔案的,因此能不能找到庫檔案,其搜尋路徑至關重要,我們可以通過修改環境變數PKG_CONFIG_PATH
來修改該命令的搜尋路徑。
更具體的說,pkg-config
命令是通過查詢*.pc
檔案來找到庫的位置的,而剛剛提到的PKG_CONFIG_PATH
就是用於指示*.pc
檔案的路徑。剛剛執行cmake
安裝OpenCV時,我們開啟了OPENCV_GENERATE_PKGCONFIG
選項,該選項為我們建立了pkg-config
指令需要的~/lib/pkgconfig/opencv4.pc
檔案,因此我們將環境變數PKG_CONFIG_PATH
的值設定為該檔案所在的目錄即可,在~/.bashrc
中新增以下內容。如果之前PKG_CONFIG_PATH
有其他內容的話建議在前面追加而不是直接覆蓋。
export PKG_CONFIG_PATH=/home/fangqingkai/lib/pkgconfig/
(由於OpenCV4預設不生成opencv4.pc
檔案,這裡折騰了好久…嘗試按照網上的教程自己寫opencv.pc
檔案,但由於OpenCV版本問題一直出現error,最後開啟選項才解決這個問題。)
使用g++編譯
首先需要說明的是,使用CMake編譯是更加推薦的方式,這也是為什麼OpenCV4預設不生成opencv4.pc
檔案,但對CMake不太熟悉的小夥伴(比如我)可能還是會選擇使用g++來進行編譯。使用g++編譯的命令如下,原始檔為optimizer.cpp
,這裡通過pkg-config
命令動態連結所需要的庫,最後注意一定要使用C++11以上版本,否則會出錯。
g++ optimizer.cpp -o optimizer `pkg-config opencv4 --cflags --libs` -std=c++14
使用CMake編譯
使用CMake編譯則較為容易,按照以下模板填寫專案名、原始檔即可。CMakeLists.txt
如下。
cmake_minimum_required(VERSION 3.15)
project(optimizer)
find_package(OpenCV)
set(CMAKE_CXX_STANDARD 14)
add_executable(optimizer optimizer.cpp)
target_link_libraries(optimizer ${OpenCV_LIBS})
執行以下命令編譯。
cmake .
make
總結
梳理了一下其實也沒有太複雜的地方,不過在配置過程中還是折騰了一段時間...搞的過程中也深感自己基本功不夠紮實,g++的編譯引數還得查來查去(捂臉),CMake也應該好好學習一下。想到今天在知乎很火的CMake堆排序/紅黑樹面試題,感覺再不學習就要失業了呀(逃