1. 程式人生 > 其它 >cmake linux模板 多目錄_Ubuntu16.04非root使用者安裝OpenCV4並使用g++/CMake編譯

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堆排序/紅黑樹面試題,感覺再不學習就要失業了呀(逃