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 的编译可能需要大量内存,建议在有足够内存的机器上执行。
- 文件大小:静态库通常比动态库大得多,因为它们包含完整的实现。
- 依赖管理:静态库不会自动处理依赖关系,因此需要手动链接所有相关的库。
- 编译时间:静态库的编译时间可能更长,因为它需要生成完整的实现。