当前位置: 首页 > news >正文

Linux下编译opencv-4.10.0(静态链接库和动态链接库)

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) 配置动态链接库

进入 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 \..

(3) 配置静态链接库

进入 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 \..

注意:

  • 使用不同的安装路径(如 /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

注意事项

  1. 多版本冲突:如果系统中已有其他版本的 OpenCV,可能会导致冲突。建议通过 CMAKE_INSTALL_PREFIX 指定独立的安装路径,保证动态库和静态库安装在不同的路径,避免冲突。
  2. Python 支持:确保你的 Python 环境正确配置,并安装了 numpy
  3. CUDA 支持:如果你有 NVIDIA GPU 并希望启用 CUDA 加速,可以在 cmake 命令中添加 -D WITH_CUDA=ON 参数。
  4. 内存需求:OpenCV 的编译可能需要大量内存,建议在有足够内存的机器上执行。
  5. 文件大小:静态库通常比动态库大得多,因为它们包含完整的实现。
  6. 依赖管理:静态库不会自动处理依赖关系,因此需要手动链接所有相关的库。
  7. 编译时间:静态库的编译时间可能更长,因为它需要生成完整的实现。

相关文章:

  • Vivado版本升级后AXI4-Stream Data FIFO端口变化
  • centos7使用yum快速安装最新版本Jenkins-2.462.3
  • IDEA将本地的JAR文件手动安装到 Maven的本地仓库
  • AI日报 - 2025年04月25日
  • 数据库day-07
  • VS Code 智能代理模式:重塑开发体验
  • NOIP2013 提高组.转圈游戏
  • Explain详解与索引最佳实践
  • 利用deepseek快速生成甘特图
  • 32单片机——外部中断
  • 基于 springboot+vue+elementui 的办公自动化系统设计(
  • 代码注释标记的含义
  • 图论算法体系:并查集、生成树、排序与路径搜索全解析
  • CVE-2024-23897-Jenkins 2.441之前版本存在任意文件读取漏洞
  • GLM-4V:多模态大模型在图像识别领域的突破性实践
  • 如何解析商品详情页面
  • Spark-streaming核心编程
  • 甘特图Vue3 | 原生绘制
  • leetcode 69和367
  • 构造函数体赋值和初始化列表
  • 人民日报钟声:国际社会应共同维护科学溯源的正确方向
  • “80后”商洛市委副书记、市政府党组副书记赵孝任商洛市副市长
  • 专访 | 杜普兰蒂斯:爱上中国文化,下一步努力提升速度
  • 普京与卢卡申科举行会晤,将扩大在飞机制造等领域合作
  • 广西干旱程度有所缓解,未来一周旱情偏重地区降水量仍不足
  • 科学时代重读“老子”的意义——对谈《老子智慧八十一讲》