Ubuntu下编译opencv4.5遇到的问题及解决方法

news2024/11/29 11:47:55

一、编译opencv4.5的步骤

1、安装依赖项

sudo apt update
sudo apt install build-essential cmake git pkg-config \
libjpeg-dev libtiff-dev libpng-dev \
libavcodec-dev libavformat-dev libswscale-dev \
libv4l-dev libxvidcore-dev libx264-dev \
libgtk-3-dev libatlas-base-dev gfortran \
python3-dev python3-numpy \
libdc1394-22-dev libopenblas-dev \
liblapack-dev libhdf5-dev libprotobuf-dev \
protobuf-compiler libgoogle-glog-dev \
libgtest-dev libtbb2 libtbb-dev

2、下载OpenCv源代码

cd ~
git clone -b 4.5.0 https://github.com/opencv/opencv.git
git clone -b 4.5.0 https://github.com/opencv/opencv_contrib.git

3、创建构建目录

cd ~/opencv
mkdir build
cd build

4、使用cmake配置构建

cmake -DOPENCV_EXTRA_MODULES_PATH=~/edcc/opencv_contrib/modules -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..

5、编译Opencv

make -j$(nproc)

-j$(nproc) 表示使用所有可用的处理器核心进行并行编译,提高编译速度。

6、安装OpenCv

sudo make install

7、更新库缓存

sudo ldconfig

8、验证安装

import cv2
print(cv2.__version__)

二、出现的问题

错误1

在opencv的构建过程中,在第5步进行编译的时候,出现了下面的问题。

In file included from /mnt/c/Users/AppData/Local/anaconda3/Library/include/hdf5.h:21,
                 from /home/user/edcc/opencv_contrib/modules/hdf/src/hdf5.cpp:37:
/mnt/c/Users/AppData/Local/anaconda3/Library/include/H5public.h:285:19: error: conflicting declaration ‘typedef long long int ssize_t’
  285 | typedef long long ssize_t;
      |                   ^~~~~~~
In file included from /usr/include/stdlib.h:395,
                 from /usr/include/c++/11/cstdlib:75,
                 from /usr/include/c++/11/stdlib.h:36,
                 from /usr/lib/gcc/x86_64-linux-gnu/11/include/mm_malloc.h:27,
                 from /usr/lib/gcc/x86_64-linux-gnu/11/include/xmmintrin.h:34,
                 from /usr/lib/gcc/x86_64-linux-gnu/11/include/emmintrin.h:31,
                 from /home/user/edcc/opencv/modules/core/include/opencv2/core/cv_cpu_dispatch.h:33,
                 from /home/user/edcc/opencv/modules/core/include/opencv2/core/cvdef.h:343,
                 from /home/user/edcc/opencv/modules/core/include/opencv2/core.hpp:52,
                 from /home/user/edcc/opencv_contrib/modules/hdf/src/precomp.hpp:38,
                 from /home/user/edcc/opencv_contrib/modules/hdf/src/hdf5.cpp:35:
/usr/include/x86_64-linux-gnu/sys/types.h:108:19: note: previous declaration as ‘typedef __ssize_t ssize_t’
  108 | typedef __ssize_t ssize_t;
      |                   ^~~~~~~
make[2]: *** [modules/hdf/CMakeFiles/opencv_hdf.dir/build.make:76: modules/hdf/CMakeFiles/opencv_hdf.dir/src/hdf5.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:3615: modules/hdf/CMakeFiles/opencv_hdf.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

这个问题是,两份头文件中对‘ssize_t’的定义出现了冲突,一份头文件是在windows环境下,另一份头文件是在wsl环境下的Ubuntu中。

问题:

为什么在wsl环境下Ubuntu中conda独立的环境下进行编译,会涉及到windows下的内容?

/mnt/c/Users/AppData/Local/anaconda3/Library/include/hdf5.h:22,

这个路径是在windows下的conda中

/home/user/opencv_contrib/modules/hdf/src/hdf5.cpp:37:

这个路径是在wsl环境下建立的一个ubuntu环境中

原因:

一个原因是,在 WSL(Windows Subsystem for Linux)环境中编译时引用 Windows 路径的问题,通常与以下几个因素有关:
1. 环境变量配置:
编译过程中,特别是使用 CMake、Makefile 或其他构建工具时,环境变量(特别是 PATH、C_INCLUDE_PATH 和 CPLUS_INCLUDE_PATH)的配置可能会包含 Windows 的路径。这会导致编译器优先查找 Windows 下的库或头文件。

1. 检查和修改环境变量:
在 WSL 环境中,确保没有设置指向 Windows 的环境变量。可以通过命令行检查:

echo $PATH

下面是检查的结果

echo $PATH
/home/user/anaconda3/envs/edcc/bin:/home/user/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/bin:/mnt/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/libnvvp:/mnt/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/extras/CUPTI/lib64:/mnt/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/cudnn/bin:/mnt/c/Program Files/Microsoft MPI/Bin:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0:/mnt/c/WINDOWS/System32/OpenSSH:/mnt/c/Program Files/nodejs:/mnt/c/Program Files/Microsoft OLE DB Provider for DB2/System:/mnt/c/Program Files/PuTTY:/mnt/c/Program Files (x86)/NetSarang/Xshell 7:/mnt/c/Users/gjmhs4/Downloads/adb&&fastboot:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/c/Program Files/CMake/bin:/mnt/c/Program Files (x86)/Windows Kits/10/Windows Performance Toolkit:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/Program Files/NVIDIA Corporation/Nsight Compute 2021.1.0:/mnt/c/Users/gjmhs4/AppData/Local/anaconda3:/mnt/c/Users/gjmhs4/AppData/Local/anaconda3/Library/mingw-w64/bin:/mnt/c/Users/gjmhs4/AppData/Local/anaconda3/Library/usr/bin:/mnt/c/Users/gjmhs4/AppData/Local/anaconda3/Library/bin:/mnt/c/Users/gjmhs4/AppData/Local/anaconda3/Scripts:/mnt/c/Users/gjmhs4/AppData/Local/Continuum/anaconda3:/mnt/c/Users/gjmhs4/AppData/Local/Continuum/anaconda3/Library/mingw-w64/bin:/mnt/c/Users/gjmhs4/AppData/Local/Continuum/anaconda3/Library/usr/bin:/mnt/c/Users/gjmhs4/AppData/Local/Continuum/anaconda3/Library/bin:/mnt/c/Users/gjmhs4/AppData/Local/Continuum/anaconda3/Scripts:/mnt/c/Users/gjmhs4/AppData/Local/Microsoft/WindowsApps:/mnt/c/Program Files/JetBrains/PyCharm Community Edition 2022.1.2/bin:/mnt/c/Users/gjmhs4/AppData/Roaming/npm:/mnt/c/Users/gjmhs4/Downloads/bazel-5.4.1-windows-x86_64:/mnt/c/Users/gjmhs4/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/c/Users/gjmhs4/AppData/Local/Programs/Git/cmd:/mnt/d/Downloads/platform-tools:/mnt/c/Users/gjmhs4/AppData/Roaming/Programs/Zero Install:/snap/bin
(edcc) user@DLJDM85M3:~/edcc/opencv/build$ echo $C_INCLUDE_PATH

这个/mnt/c/Program Files的路径就是在windows下的路径

理论解决办法:

为了去除环境变量中指向 Windows 下的路径,您可以按照以下步骤进行操作:

1、打开您的 Linux shell 或终端。
2、运行以下命令编辑您的环境变量文件(例如 .bashrc 或 .bash_profile):

nano ~/.bashrc

nano ~/.bash_profile

3、在打开的文件中,找到包含 Windows 路径的环境变量行。
4、将行的开头添加一个 #,将其注释掉。这将禁用该环境变量。
5、使用 Ctrl + X 保存并退出 Nano 编辑器。
6、运行  source ~/.bashrc  来使更改生效。
完成上述步骤后,Windows 路径将不再包含在您的环境变量中,从而避免了编译时引用 Windows 下的内容。

实际解决办法:

在打开的~/.bashrc文件中,并没有发现指向windows的路径

由于您提供的 ~/.bashrc 片段中没有直接显示 Windows 路径,通常这些路径是通过 export PATH 语句添加的。您需要在 .bashrc 文件中查找是否有 export PATH 相关的行,并将这些与 /mnt/c/ 开头的路径从 PATH 中移除。
若没有此类行,您可以手动创建一个新的 export PATH 行,但保留您想要保留的路径,类似于以下的方式:

把上面通过echo $PATH中显示出来的路径中,关于windows部分的路径去除,然后添加到.bashrc文件中。

export PATH="/home/user/anaconda3/envs/edcc/bin:/home/user/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/snap/bin"

具体步骤:
1、使用 nano ~/.bashrc 打开 .bashrc 文件。
2、在文件中查找前面提到的带有 /mnt/c/ 的路径。
3、将这些行删除或注释掉。
4、如果需要,添加一行来设置 PATH,如上所示。
5、保存并退出 Nano(使用 Ctrl + X,然后选择 Y 确认保存)。
6、运行 source ~/.bashrc 来使更改生效。

根据您的情况,在将新的 export PATH 行添加到 .bashrc 文件时,通常最好将其放在文件的末尾。此行将确保您定义的路径被添加到系统的 $PATH 变量中,并且放在这个文件的末尾通常是一个很好的做法,因为这样不会干扰其他环境设置,并且能够保持整洁和清晰。
 

错误2

在解决头文件冲突的问题之后,再次进行编译出现了下面的问题

/home/user/edcc/opencv/modules/gapi/test/gapi_async_test.cpp: In member function ‘virtual void opencv_test::gtest_case_output_args_lifetime_::callback<gtest_TypeParam_>::TestBody()’:
/home/user/edcc/opencv/modules/gapi/test/gapi_async_test.cpp:448:26: error: ‘sleep_for’ is not a member of ‘std::this_thread’
  448 |        std::this_thread::sleep_for(std::chrono::milliseconds{2});
      |                          ^~~~~~~~~
make[2]: *** [modules/gapi/CMakeFiles/opencv_test_gapi.dir/build.make:286: modules/gapi/CMakeFiles/opencv_test_gapi.dir/test/gapi_async_test.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....

原因是

C++标准不匹配:std::this_thread::sleep_for 函数是 C++11 及以上版本的函数。如果您的编译选项未设置为使用 C++11 或更高版本,就会出现这个错误。

原来的cmake命令是

cmake -DOPENCV_EXTRA_MODULES_PATH=~/edcc/opencv_contrib/modules -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..

改为

cmake -DOPENCV_EXTRA_MODULES_PATH=~/edcc/opencv_contrib/modules -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_CXX_STANDARD=11 ..

然后再make -j8进行编译

错误3

又出现了同样的错误,

通过Google查找解决方案,

https://github.com/linuxdeepin/developer-center/issues/2314

然后降低了gcc版本,原先版本是11.4.0,降为10版本

然后再重新构建Opencv,构建成功。

解决问题的心得:感觉提出问题比解决问题更重要。提问的过程就是发现问题症结的过程,可能一个表象问题有不同的解决方案,但是究竟用哪一个还得对症下药。

20241014

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215809.html

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

相关文章

使用Arcgis批量自动出图

操作方法如下&#xff1a; 1 2 3 4 5 6 7 设置好选项&#xff0c;开始打印。 8 生成pdf。 第一步&#xff1a;shp放到数据库中&#xff0c;标注转注记&#xff0c;然后编辑注记&#xff0c;符号样式设置好。准备出图&#xff1a;&#xff08;转注记时候尽量压盖监测等选最…

使用Windows创建一个MFC应用【带界面】

MFC使用教程【对初学者保姆型友好&#xff01;】 目录 前提条件 1&#xff1a;创建MFC应用程序 2. 项目结构解读 引用 外部依赖项 头文件 源文件 资源文件 文件功能详解 项目的主要流程 步骤2&#xff1a;配置OpenCV 安装OpenCV 包含目录与库文件 步骤3&#xff1…

啤酒酿造中的温度与时间魔法:精酿啤酒的匠心之旅

在精酿啤酒的世界里&#xff0c;温度与时间仿佛两位默契的舞者&#xff0c;在酿造过程中演绎着一段段美妙的舞蹈。而Fendi Club精酿啤酒&#xff0c;正是这段舞蹈的品牌&#xff0c;将温度与时间的魔法发挥到了致点。 一、温度的魔法&#xff1a;酿造中的温暖与冷静 在啤酒酿…

【原创教程】电气电工25:如何选择接近传感器

我们今天来看看经常遇到的接近传感器,在电气电工工作中,这种传感器随处可见,所以我们要对它有一个深度的认知。 一、接近传感器的工作原理 1、通过高频发震器Coil而发出高频磁场 2、被测对象(金属)接近时表面会产生涡电流(Eddy Current),涡电流又会引发磁场 3、…

OceanBase中扩容OCP节点step by step

许多用户在开始使用OceanBase时部署OCP&#xff0c;通常选择单节点部署。但随着后续业务规模的不断扩大&#xff0c;会开始担忧单节点OCP在面对故障时可能丧失对集群运维管控的连续性。鉴于此&#xff0c;会将现有的单节点OCP扩展至多节点部署&#xff0c;以此来确保OCP服务的高…

【HarmonyOS】HMRouter使用详解(四)路由拦截

路由拦截器 可以对指定或全局路由跳转时添加拦截器&#xff0c;作用是可以实现在页面切换前做判断是否有进入当前页面的权限。这篇文章将实现登录的全局路由拦截样式。 新建拦截器类 通过继承IHMInterceptor接口实现生命周期接口的方法重写。 通过添加HMInterceptor装饰器&…

使用Docker部署nextjs应用

最近使用nextjs网站开发&#xff0c;希望使用docker进行生产环境的部署&#xff0c;减少环境的依赖可重复部署操作。我采用的是Dockerfile编写应用镜像方式 docker-compose实现容器部署的功能。 Docker Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器…

大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

CMake学习笔记(四)cmake --build使用踩坑记录

根据 深入理解 CMake 的 cmake --build 命令_cmake build-CSDN博客等消息来源的说法&#xff0c; cmake --build <dir> 将在目录<dir>中产生结果文件。但是实测发现&#xff0c;这里有坑&#xff1a;如果目录<dir>中没有CMakeCache.txt等文件的话&#xff…

门店收银系统源码-php+flutter+uniapp

1. 系统开发语言 核心开发语言: PHP、HTML5、Dart 后台接口: PHP7.3 后台管理网站: HTML5vue2.0element-uicssjs 线下收银台&#xff08;安卓/PC收银、安卓自助收银&#xff09;: Dart3 框架&#xff1a;Flutter 3.19.6 移动店务助手: uniapp 线上商城: uniapp 2.线下收…

每天花2分钟学数字化转型,第二讲:数字化

每天花2分钟学习数字化转型&#xff0c;第二讲&#xff1a;什么是数字化转型&#xff1f; 数字化转型的定义 Gartner对数字化(digitalization)的定义&#xff1a;数字化就是利用数字技术来改变商业模式并提供新的收入和价值创造机会&#xff1b;是转向数字业务的过程。 从这个…

叉车安全防撞装置的作用

‌叉车安全防撞装置的核心作用在于提升叉车运行时的安全性&#xff0c;特别是在倒车或经过岔路口等驾驶员视线可能受阻的情境下&#xff0c;通过探测叉车周围的障碍物距离&#xff0c;实时为驾驶员提供必要的辅助信息&#xff0c;有效预防碰撞事故的发生。‌ 这些装置通过多种技…

【多模态】ViT模型技术学习

前言 最近多模态模型特别火&#xff0c;模型也越来越小&#xff0c;性能优异的MiniCPM-2.6只有8B大小&#xff0c;它采用的图片编码器是SigLipViT模型&#xff0c;一起从头学习ViT和Transformer&#xff01;本文记录一下学习过程&#xff0c;所以是自上而下的写&#xff0c;从…

windows上svn设置忽略

目的 就是在windows环境下设置svn的需要忽略的文件&#xff0c;这还是挺实用的一个功能&#xff0c;不然&#xff0c;很多编译的中间文件都上传到svn上了&#xff0c;这样就不好了&#xff1b;ignore设置&#xff0c;也需要注意一下。 过程 svn服务端式忽略&#xff0c;这是…

【前端】制作一个简单的网页(2)

单标签组成的元素 这类标签不需要内容产生效果&#xff0c;通常表示对网页的某种行为&#xff0c;它们不用标记任何内容&#xff0c;开始即是结束。 比如&#xff0c;<hr>标签的作用是在网页中添加一条分割线&#xff0c;它仅包含开始标签&#xff0c;是一个单标签元素。…

【Linux】解读信号的本质&相关函数及指令的介绍

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

k8s的部署和安装

k8s的部署和安装 一、Kubernets简介及部署方法 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个阶段&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参…

【去哪儿-注册安全分析报告-缺少轨迹的滑动条】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

查看SQL执行计划 explain

查看SQL执行计划 explain explain使用方式 alter session set current_schematest; explain plan for sql语句; --并不会实际执行&#xff0c;因此生成的执行计划也是预估的 select * from table(dbms_xplan.display); explain使用场景 1.内存中没有谓词信息了&#xff0…

网站仿制的五大要素

网站仿制的五大要素 在数字化快速发展的今天&#xff0c;仿制一个网站不仅是技术上的挑战&#xff0c;更是对创意与灵感的考验。无论是为了学习设计理念&#xff0c;还是为企业进行市场竞争&#xff0c;以下五大要素是网站仿制时必不可少的。 **1. 目标分析** 在仿制网站之前…