1. 安裝依賴
在編譯之前,確保系統中安裝了必要的依賴工具和庫。運行以下命令安裝:
sudo apt update
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2
sudo apt-get install libtbb-dev libjpeg-dev libpng-dev libtiff-dev
sudo apt-get install libdc1394-22-dev
sudo apt-get install libjasper-dev
sudo apt-get install libavcodec-dev libavformat-dev
sudo apt-get install libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install ffmpeg
這些工具包括:
build-essential
: 提供 GCC 編譯器和其他開發工具。cmake
: 用于生成 Makefile。- 各種圖像處理、視頻編碼解碼相關的庫。
- Python 支持(如果需要)。
注:如果安裝 libjasper-dev 包的時候報錯,如下:
E: Unable to locate package libjasper-dev
則需要按以下步驟進行 libjasper-dev 包的安裝?
依次運行如下指令:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
2. 下載 OpenCV 源碼
如果還沒有下載源碼,可以通過以下命令獲取:
wget https://github.com/opencv/opencv/archive/refs/tags/4.10.0.zip
unzip 4.10.0.zip
如果你還需要額外的模塊(例如 opencv_contrib
),可以同時下載 opencv_contrib
模塊:
wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.10.0.zip
unzip 4.10.0.zip
mv opencv_contrib-4.10.0 opencv_contrib
mv opencv_contrib ./opencv-4.10.0/
3. 配置 CMake 參數同時生成動態和靜態庫
使用 cmake
配置編譯選項。以下是一個基本的配置命令,此處僅做參數說明不是實際配置命令:
cmake -D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=/usr/local \-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \-D ENABLE_PRECOMPILED_HEADERS=OFF \-D BUILD_EXAMPLES=ON \..
參數說明:
CMAKE_BUILD_TYPE=Release
: 設置為 Release 模式以優化性能。CMAKE_INSTALL_PREFIX=/usr/local
: 指定安裝路徑。OPENCV_EXTRA_MODULES_PATH
: 如果使用了?opencv_contrib
?模塊,指定其路徑。ENABLE_PRECOMPILED_HEADERS=OFF
: 在某些系統上可能會遇到預編譯頭文件問題,關閉此選項。BUILD_EXAMPLES=ON
: 編譯示例代碼(可選)。
如果需要支持 Python,可以添加以下參數:
-D PYTHON3_EXECUTABLE=$(which python3) \
-D PYTHON3_PACKAGES_PATH=$(python3 -m site --user-site)
為了同時生成動態和靜態庫,可以在不同的構建目錄中分別配置和編譯。
在運行 cmake
命令時,添加以下兩個關鍵參數:
BUILD_SHARED_LIBS=ON #啟用動態鏈接庫的構建。
BUILD_SHARED_LIBS=OFF #啟用靜態鏈接庫的構建。
(1) 創建兩個獨立的構建目錄
為了避免沖突,分別為動態庫和靜態庫創建兩個獨立的構建目錄。
mkdir build_shared
mkdir build_static
(2) 退出anaconda環境(如果沒有配置anaconda環境可跳過此步)
如果已經在linux下配置了anaconda環境,需要先退出環境并指定優先使用系統庫而不是 Anaconda 的庫???
這一點非常重要,這也是很多小伙伴在利用CMake配置構建系統,生成Makefile 文件時發現只是一些警告,并沒有報錯就忽視了,但是緊接著使用 make
命令編譯源代碼的時候就會發現在編譯過程中就會報錯,一頭霧水。
相關警告如下:
--
-- Configuring done
CMake Warning at cmake/OpenCVUtils.cmake:1582 (add_library):Cannot generate a safe runtime search path for target opencv_imgcodecsbecause files in some directories may conflict with libraries in implicitdirectories:runtime library [libpng16.so.16] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libz.so.1] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libtiff.so.5] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libSome of these libraries may not be found correctly.
Call Stack (most recent call first):cmake/OpenCVModule.cmake:989 (ocv_add_library)cmake/OpenCVModule.cmake:905 (_ocv_create_module)modules/imgcodecs/CMakeLists.txt:168 (ocv_create_module)CMake Warning at cmake/OpenCVUtils.cmake:1568 (add_executable):Cannot generate a safe runtime search path for target opencv_test_highguibecause files in some directories may conflict with libraries in implicitdirectories:runtime library [libgio-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libgobject-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libgthread-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libglib-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libSome of these libraries may not be found correctly.
Call Stack (most recent call first):cmake/OpenCVModule.cmake:1327 (ocv_add_executable)modules/highgui/CMakeLists.txt:309 (ocv_add_accuracy_tests)CMake Warning at cmake/OpenCVUtils.cmake:1582 (add_library):Cannot generate a safe runtime search path for target opencv_highguibecause files in some directories may conflict with libraries in implicitdirectories:runtime library [libgio-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libgobject-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libgthread-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libruntime library [libglib-2.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:/home/anaconda3/libSome of these libraries may not be found correctly.
Call Stack (most recent call first):cmake/OpenCVModule.cmake:989 (ocv_add_library)cmake/OpenCVModule.cmake:905 (_ocv_create_module)modules/highgui/CMakeLists.txt:291 (ocv_create_module)-- Generating done
-- Build files have been written to: /home/opencv-4.10.0/build_shared
沒有警告應該是這樣的:
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/opencv-4.10.0/build_shared
為了避免出現Anaconda環境干擾,導致在編譯的時候系統庫被覆蓋或隱藏,出現錯誤,因此做如下處理:
?①?禁用 Anaconda 環境
conda deactivate
② 設置?LD_LIBRARY_PATH
臨時修改 LD_LIBRARY_PATH
,優先使用系統庫而不是 Anaconda 的庫:
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
③ 配置?CMAKE_PREFIX_PATH(可選)
在運行 CMake 時,增加顯式指定庫路徑,搭配接下來操作中的CMake語句使用:
cmake -DCMAKE_PREFIX_PATH=/usr/lib/x86_64-linux-gnu ..
(3) 配置動態鏈接庫
進入 build_shared
目錄并運行 CMake,啟用動態庫構建:
cd build_shared
cmake -D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=/home/opencv-4.10.0/build_shared \ #修改成自己想保存的下載位置-D BUILD_SHARED_LIBS=ON \-D OPENCV_EXTRA_MODULES_PATH=/home/opencv-4.10.0/opencv_contrib/modules \ #修改成自己opencv_contrib所在的位置..
(4) 配置靜態鏈接庫
進入 build_static
目錄并運行 CMake,啟用靜態庫構建:
cd build_static
cmake -D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=/home/opencv-4.10.0/opencv_static \ #修改成自己想保存的下載位置-D BUILD_SHARED_LIBS=OFF \-D OPENCV_EXTRA_MODULES_PATH=/home/opencv-4.10.0/opencv_contrib/modules \ #修改成自己opencv_contrib所在的位置..
注意:
- 使用不同的安裝路徑(如?
/usr/local/opencv_shared
?和?/usr/local/opencv_static
),以避免沖突。 - 如果不需要?
opencv_contrib
?模塊,可以省略?-D OPENCV_EXTRA_MODULES_PATH
?參數。
4. 編譯和安裝
分別在兩個構建目錄中執行編譯和安裝命令。
(1) 編譯和安裝動態庫
在 build_shared
目錄中:
make -j$(nproc)
sudo make install
(2) 編譯和安裝靜態庫
在 build_static
目錄中:
make -j$(nproc)
sudo make install
5. 驗證安裝
安裝完成后,可以分別驗證動態庫和靜態庫是否正確生成。
(1) 動態庫驗證
檢查動態庫文件是否存在于安裝路徑下,例如:
ls /usr/local/opencv_shared/lib
你應該會看到類似 libopencv_core.so
的動態庫文件。
(2) 靜態庫驗證
檢查靜態庫文件是否存在于安裝路徑下,例如:
ls /usr/local/opencv_static/lib
你應該會看到類似 libopencv_core.a
的靜態庫文件。
6. 使用動態庫或靜態庫
在項目中使用 OpenCV 時,需要根據需求選擇動態庫或靜態庫。
(1) 使用動態庫
確保動態庫路徑已添加到系統的動態鏈接器緩存中:
sudo ldconfig
然后在編譯項目時鏈接動態庫即可。
(2) 使用靜態庫
在編譯項目時,顯式指定靜態庫路徑和文件。例如:
g++ my_program.cpp -I/usr/local/opencv_static/include/opencv4 \-L/usr/local/opencv_static/lib \-lopencv_core -lopencv_imgproc -lopencv_highgui -static
注意:
- 使用?
-static
?參數強制鏈接靜態庫。 - 確保鏈接所有必要的靜態庫模塊。
7. 清理(可選)
如果不再需要編譯過程中的臨時文件,可以清理它們:
make clean
注意事項
- 多版本沖突:如果系統中已有其他版本的 OpenCV,可能會導致沖突。建議通過?
CMAKE_INSTALL_PREFIX
?指定獨立的安裝路徑,保證動態庫和靜態庫安裝在不同的路徑,避免沖突。 - Python 支持:確保你的 Python 環境正確配置,并安裝了?
numpy
。 - CUDA 支持:如果你有 NVIDIA GPU 并希望啟用 CUDA 加速,可以在?
cmake
?命令中添加?-D WITH_CUDA=ON
?參數。 - 內存需求:OpenCV 的編譯可能需要大量內存,建議在有足夠內存的機器上執行。
- 文件大小:靜態庫通常比動態庫大得多,因為它們包含完整的實現。
- 依賴管理:靜態庫不會自動處理依賴關系,因此需要手動鏈接所有相關的庫。
- 編譯時間:靜態庫的編譯時間可能更長,因為它需要生成完整的實現。