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

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. 编译时间:静态库的编译时间可能更长,因为它需要生成完整的实现。
http://www.xdnf.cn/news/1723.html

相关文章:

  • Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
  • 2025-04-24 Python深度学习4—— 计算图与动态图机制
  • 极狐GitLab 如何 cherry-pick 变更?
  • STM32移植最新版FATFS
  • Godot开发2D冒险游戏——第二节:主角光环整起来!
  • C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
  • STM32F103_HAL库+寄存器学习笔记20 - CAN发送中断+ringbuffer + CAN空闲接收中断+接收所有CAN报文+ringbuffer
  • Python爬虫去重策略:增量爬取与历史数据比对
  • VulnHub-DC-2靶机渗透教程
  • zip是 Python 中 `zip` 函数的一个用法
  • 数模学习:一,层次分析法
  • flutter 小知识
  • 在Ubuntu 18.04 和 ROS Melodic 上编译 UFOMap
  • 跨浏览器音频录制:实现兼容的音频捕获与WAV格式生成
  • Spring Security认证流程
  • LabVIEW实现Voronoi图绘制功能
  • 【MQ篇】初识RabbitMQ保证消息可靠性
  • 信息系统项目管理工程师备考计算类真题讲解七
  • KMS工作原理及其安全性分析
  • Java Agent 注入 WebSocket 篇
  • java方法引用
  • kotlin和MVVM的结合使用总结(二)
  • 一种Spark程序运行指标的采集与任务诊断实现方式
  • CE第二次作业
  • NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve
  • Git 的基本概念和使用方式
  • C++跨平台开发要点
  • Spring AI 核心概念
  • 【Linux】网络基础和socket
  • HGDB安全版单机修改用户密码