亲测成功❗❗❗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) 退出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

注意事项

  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.mzph.cn/bicheng/78270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows 部署Prometheus+Node-expoter

Prometheus v3.2.1 离线部署方式 通过helm部署prometheus会自动部署Node-expoter只需要添加prometheus的抓取规则!! 删除: 清除之前安装的 Prometheus 如果你之前已经安装了 Prometheus,需要清除原有的 Prometheus 安装&#xf…

HTMLCSS实现网页轮播图

网页中轮播图区域的实现与解析 在现代网页设计中&#xff0c;轮播图是一种常见且实用的元素&#xff0c;能够在有限的空间内展示多个内容&#xff0c;吸引用户的注意力。下面将对上述代码中轮播图区域的实现方式进行详细介绍。 一、HTML 结构 <div class"carousel-c…

Linux:进程的概念

基本概念 课本概念&#xff1a;程序的一个可执行实例&#xff0c;正在执行的程序。 内核观点&#xff1a;担当分配系统资源实体。 当操作系统要执行程序时&#xff0c;也就是说操作系统要执行代码&#xff0c;但一个操作系统需要执行多个程序&#xff0c;而CPU只有一块&#xf…

前端基础之《Vue(10)—过滤器》

一、过滤器 1、作用 用于数据处理。 2、全局过滤器 使用Vue.filter(名称, val>{return newVal})定义。 在任何组件中都可以直接使用。 3、局部过滤器 使用选项&#xff0c;filters: {}定义&#xff0c;只能在当前组件中使用。 4、过滤器在Vue 3.0中已经淘汰了 5、过滤器…

平板电脑做欧盟网络安全法案(EU)2022/30

平板电脑做欧盟网络安全法案&#xff08;EU&#xff09;2022/30 平板电脑做EN18031,平板电脑做无障碍法规EU2019/882 欧盟委员会于2022年通过补充授权法案 &#xff08;EU&#xff09; 2022/30&#xff0c;明确要求无线电设备需满足网络安全、隐私保护及反欺诈要求。 新规时间轴…

Unity中打可选择的AssetBundle,以及URP中加载AssetBundle包Shader丢失问题显示洋红色的解决方案

在上一篇打AssetBundle中已经实现了简单的打AB包和加载,《Unity中打包AssetBundle并加载》,本篇笔记是进一步上一篇最后提出的问题,进行优化。 一、打可选择的AssetBundle 每次打包都会把设置了AssetBundle名称和后缀的所有文件都打包,这也是现在网上教学最多的 但是有时…

解决cannot find attribute `serde` in this scope记录

问题描述&#xff1a; 在Rust中使用serde做json序列化&#xff0c;需要对一个字段指定序列化方法&#xff0c;添加serde注解后报错: error: cannot find attribute serde in this scope --> src\models\order_model.rs:38:7 | 38 | #[serde(deserialize_with &qu…

基于whisper和ffmpeg语音转文本小程序

目录 一、环境准备 ✅ 第一步&#xff1a;安装并准备 Conda 环境 ✅ 第二步&#xff1a;创建 Whisper 专用的 Conda 虚拟环境 ✅ 第三步&#xff1a;安装 GPU 加速版 PyTorch&#xff08;适配 RTX 4060&#xff09; ✅ 第四步&#xff1a;安装 Whisper 和 FFMPEG 依赖 ✅…

Linux GPIO驱动开发实战:Poll与异步通知双机制详解

1. 引言 在嵌入式Linux开发中&#xff0c;GPIO按键驱动是最基础也最典型的案例之一。本文将基于一个支持poll和异步通知双机制的GPIO驱动框架&#xff0c;深入剖析以下核心内容&#xff1a; GPIO中断与防抖处理环形缓冲区设计Poll机制实现异步通知(SIGIO)实现应用层交互方式 …

【最新版】西陆健身系统源码全开源+uniapp前端

一.系统介绍 一款基于UniappThinkPHP开发健身系统&#xff0c;支持多城市、多门店&#xff0c;包含用户端、教练端、门店端、平台端四个身份。有团课、私教、训练营三种课程类型&#xff0c;支持在线排课。私教可以通过上课获得收益&#xff0c;在线申请提现功能&#xff0c;无…

济南国网数字化培训班学习笔记-第二组-6-输电线路现场教学

输电线路现场教学 杆塔组装 角钢塔 角钢-连扳-螺栓 螺栓&#xff08;M&#xff09;&#xff1a; 脚钉-螺栓&#xff08;螺栓头-无扣长-螺纹-螺帽&#xff09;-垫片-螺帽/防盗帽/防松帽M20*45 表示直径20mm&#xff0c;长度45mm螺栓级别由一个类似浮点数表示&#xff0c;如…

抖音的逆向工程获取弹幕(websocket和protobuf解析)

目录 声明前言第一节 获取room_id和ttwid值第二节 signture值逆向python 实现signature第三节 Websocket实现长链接请求protubuf反序列化pushFrame反序列化Response解压和反序列化消息体Message解析应答ack参考博客声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的…

反射,枚举,lambda表达式

目录 反射枚举的使用Lambda表达式函数式接口语法Lambda表达式语法精简 变量捕获Lambda在集合List中的使用 反射 作用&#xff1a;在Java代码中&#xff0c;让一个对象认识到自己 比如一个类的名字&#xff0c;里面的方法&#xff0c;属性等 让程序运行的过程&#xff0c;某个对…

鸿蒙移动应用开发--渲染控制实验

任务&#xff1a;使用“对象数组”、“ForEach渲染”、“Badge角标组件”、“Grid布局”等相关知识&#xff0c;实现生效抽奖卡案例。如图1所示&#xff1a; 图1 生肖抽奖卡实例图 图1(a)中有6张生肖卡可以抽奖&#xff0c;每抽中一张&#xff0c;会通过弹层显示出来&#xf…

webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)

目录 1、webpack简介2、简单示例3、入口(entry)和输出(output)4、自动生成html文件5、打包css代码6、优化&#xff08;单独提取css代码&#xff09;7、优化&#xff08;压缩过程&#xff09;8、打包less代码9、打包图片10、搭建开发环境&#xff08;webpack-dev-server&#xf…

Java快速上手之实验4(接口回调)

1&#xff0e;编写接口程序RunTest.java&#xff0c;通过接口回调实现多态性。解释【代码4】和【代码6】的执行结果为何不同&#xff1f; interface Runable{ void run(); } class Cat implements Runable{ public void run(){ System.out.println("猫急上树.."…

Volcano 实战快速入门 (一)

一、技术背景 随着大型语言模型&#xff08;LLM&#xff09;的蓬勃发展&#xff0c;其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源&#xff08;尤其是 GPU&#xff09;的巨大需求、分布式任务固有的复杂依…

Qwen2.5简要全流程以及QA

1 输入prompt 得到input id input id&#xff1a; [B,L] # batch size , lenth 2 embeding之后得到 input_embeds: [B,L,D] # demensions 3 进入Transformer层 先通过linear层得到shape不变的 QKV 多头注意力 分割Dimension &#xff0c; kv变成 [B,H,L,head_dim] h是…

爬虫学习——Item封装数据与Item Pipeline处理数据

一、Item封装数据 对于有字段的数据&#xff0c;最好的数据结构维护方法为字典类型(dict)&#xff0c;但是由于字典不便于携带元数据和传递给其他组件使用&#xff0c;故可以使用Item类封装爬取到的数据。 这里涉及两个类&#xff1a;Item基类和Field类 两者的使用关系如下&…

【React】状态管理 Context API \ MobX \ Redux

Context APIMobXRedux React有自己状态管理&#xff0c;周边生态也有很多状态管理 Context API 直接从react中引入并调用即可&#xff0c;context包含两个东西&#xff1a; Provider&#xff1a;提供商&#xff08;翻译&#xff09;&#xff0c;提供数据&#xff1b;属性&…