统信UOS linux下opencv应用编译时的头文件和库文件路径查找设置方法

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython

一、引言

老猿原来进行的C和C++开发主要是基于windows环境的,目前要在统信UOS操作系统环境下编译opencv应用程序,其环境设置与windows环境下变化很多,今天就来介绍一下在统信UOS linux下opencv应用编译时的头文件和库文件路径查找的多种设置方法。

二、环境介绍

老猿的机器操作系统是统信UOS 64位linux Debian系操作系统,opencv安装的版本是opencv4.3.0,下载的opencv源文件解压后在/home/openCV/OpenCV430目录,最终编译完整的库安装目录是/usr/local/opencv430。

测试代码test.cpp文件内容如下:

#include <opencv2/opencv.hpp>int main() 
{// 读取图片cv::Mat image = cv::imread("文件目录用途.png");// 检查是否成功读取图片if (image.empty()) {std::cout << "无法读取图片" << std::endl;return -1;}// 创建窗口并显示图片cv::namedWindow("Image", cv::WINDOW_NORMAL);cv::imshow("Image", image);// 等待按下任意键后关闭窗口cv::waitKey(0);cv::destroyAllWindows();return 0;
}

编译使用gcc或g++编译器。

三、编译时找不到opencv2/opencv.hpp

3.1、错误情况

编译时找不到opencv2/opencv.hpp,报错信息如下:

administrator@jwp:~/E_DRIVER/opencv/test$ g++ test.cpp -o test  -lopencv_core -lopencv_highgui  -lopencv_imgcodecs 
test.cpp:1:10: fatal error: opencv2/opencv.hpp: 没有那个文件或目录#include <opencv2/opencv.hpp>^~~~~~~~~~~~~~~~~~~~
compilation terminated.
administrator@jwp:~/E_DRIVER/opencv/test$ 

这是由于头文件所在目录未加入到编译器的搜索路径。

3.2. 解决办法

头文件搜索路径的设置有多个方法,下面逐一介绍。

3.2.1 办法1:建立指向opencv头文件路径的软连接

在/usr/include目录建立软连接指向opencv安装目录的头文件目录,这是因为统信操作系统中的c编译器默认会搜索/usr/include,以老猿机器opencv安装目录/usr/local/opencv430为例,具体指令为:

ln -s /usr/local/opencv430/include/opencv4/opencv2 /usr/include/opencv2

这样上面"统信环境下的动态库命名机制"举例使用的编译指令就可以变为:

g++ test.cpp -o test  -L/usr/local/opencv430/lib -lopencv_core -lopencv_highgui -lopencv_imgcodecs
3.2.2 办法2:编译指令带-I参数

在编译指令中带-I参数来指定opencv库头文件路径,在老猿机器环境下参考指令为:

g++ test.cpp -o test -I/usr/local/opencv430/include/opencv4 -lopencv_core -lopencv_highgui  -lopencv_imgcodecs 
3.2.3 办法3:设置指向opencv头文件路径的环境变量

linux系统下C++编译器支持使用CPLUS_INCLUDE_PATH、C编译器支持使用C_INCLUDE_PATH来指定编译器搜索/usr/include外的其他目录路径作为头文件搜索路径,通过在终端中执行如下两条指令可以设定这2个环境变量(实际使用时用1个即可):

export CPLUS_INCLUDE_PATH=/usr/local/opencv430/include/opencv4:$CPLUS_INCLUDE_PATH 
export C_INCLUDE_PATH=/usr/local/opencv430/include/opencv4:$C_INCLUDE_PATH 

上面这两条指令执行后再编译即可确保终端中执行编译指令时搜索相关opencv的头文件,但如果是在vscode中好像还不行,必须在vscode的C++配置中的includePath中增加相关路径配置才可以,这是因为这个方式只改变了操作终端的环境变量设置,可能vscode执行编译任务时只是在当前终端输出信息,真正执行环境并不在当前终端中。

这种方式每次新开终端都必须设置,很不方便,因此一劳永逸的解决办法就是在当前用户的shell配置文件中设置,具体到统信UOS使用的bash shell,需要修改在登录用户的主目录下(/home/登录用户名)的隐藏文件.bashrc文件(用于存储用户的个性化设置,每次启动bash时都会加载登录用户的该文件,并根据其中的内容来定制当前bash的配置和环境),在其最后增加这2个环境变量中的一条或2条都增加,具体到老猿机器安装情况,需要增加如下内容:

export CPLUS_INCLUDE_PATH=/usr/local/opencv430/include/opencv4:$CPLUS_INCLUDE_PATH 
export C_INCLUDE_PATH=/usr/local/opencv430/include/opencv4:$C_INCLUDE_PATH 

这样,重新登录终端后执行编译就可以找到头文件。

3.2.4 办法4:使用pkg-config配置文件opencv4.pc

pkg-config在Linux和类Unix系统上广泛使用,被许多开源项目所采用,是一个用于检查和获取编译和链接时所需库的工具,借助pkg-config及相关配置文件开发人员在编译和链接时自动获取所需的库的信息,以便正确地构建和运行程序。

pkg-config通过读取特定的.pc文件来获取库的信息,这些.pc文件包含了库的名称、版本、编译和链接选项等信息。开发人员可以使用pkg-config命令来查询和使用这些信息。

opencv在安装时可以根据cmake指令要求自动生成符合opencv安装环境的opencv.pc文件,为了确保能正确生成和使用opencv.pc文件,需要遵循以下步骤:

  1. 确保安装了pkg-config工具,如果没安装执行:sudo apt-get install pkg-config 进行安装
  2. cmake时需要指定OPENCV_GENERATE_PKGCONFIG参数,只有这个参数值为ON时才会在构建过程中创建opencv.pc文件。下面是老猿在构建时的指令样例:cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv430 -D OPENCV_GENERATE_PKGCONFIG=ON
  3. 在opencv库整体安装完成后,创建的opencv.pc文件被保存在opencv源路径的子目录的build/unix-instal子目录或这库的安装目录的lib/pkgconfig下,如在老猿机器执行安装后,具体路径为:/home/openCV/OpenCV430/build/unix-install/usr/local/opencv430/lib/pkgconfig,虽然有2个目录,实际上应该使用安装目录的路径,注意对于opencv4.3.0来说文件名叫opencv4.pc,为了后续操作简便,改名叫opencv.pc;
  4. 设置环境变量PKG_CONFIG_PATH用于指向opencv4.pc文件所在目录,例如老猿的安装版本中,使用如下命令来指向:export PKG_CONFIG_PATH=/usr/local/opencv430/lib/pkgconfig,当然该文件最好放在登录用户的shell环境设置文件中,即在登录用户的主目录下(/home/登录用户名)的隐藏文件.bashrc文件添加该条指令。本项工作完成后,重新登录终端后执行pkg-config --libs --cflags opencv就可以看到相关编译和链接选项,如果上步文件没改名则上述指令的最后一个参数要改为opencv4
  5. 编译指令带参数:`pkg-config --cflags --libs opencv`,注意必须带首尾的`符号(这个字符称为可显示字符,不是单引号)。具体到老猿的测试案例,使用指令为:g++ -o test test.cpp `pkg-config --cflags --libs opencv`,在以其他方式解决了头文件的搜索路径后,该指令也可以变成:g++ -o test test.cpp `pkg-config --libs opencv`。

上述步骤是老猿建议的标准操作步骤,当然对于熟悉linux操作和opencv的人来说,可以直接增加相关配置文件即可。

四、连接时找不到库文件

在编译执行link操作时找不到库文件,以老猿机器环境为例:

administrator@jwp:~/E_DRIVER/opencv/test$ g++ test.cpp -o test -I/usr/local/opencv430/include/opencv4 -lopencv_core -lopencv_highgui  -lopencv_imgcodecs 
/usr/bin/ld: 找不到 -lopencv_core
/usr/bin/ld: 找不到 -lopencv_highgui
/usr/bin/ld: 找不到 -lopencv_imgcodecs
collect2: error: ld returned 1 exit status
administrator@jwp:~/E_DRIVER/opencv/test$ 

这个原因也是由于编译器找不到库文件的路径,与找不到头文件类似有多个解决办法,但软连接的方式不可行,这是因为编译器查找的库文件默认路径为/usr/lib,且不会搜索其下的子目录,因此没有办法通过一个软连接将其映射到/usr/lib下,而头文件可以将opencv2目录软连接到/usr/include目录下,与opencv的include下结构一致。

具体解决办法包括:

  1. 编译指令带-L参数,如以老猿机器为例:
administrator@jwp:~/E_DRIVER/opencv/test$ g++ test.cpp -o test  -lopencvlib/opencv_core -lopencvlib/opencv_highgui  -lopencv_imgcodecs 
/usr/bin/ld: 找不到 -lopencvlib/opencv_core
/usr/bin/ld: 找不到 -lopencvlib/opencv_highgui
/usr/bin/ld: 找不到 -lopencv_imgcodecs
collect2: error: ld returned 1 exit status
administrator@jwp:~/E_DRIVER/opencv/test$ g++ test.cpp -o test -L/usr/local/opencv430/lib -lopencv_core -lopencv_highgui  -lopencv_imgcodecs 
administrator@jwp:~/E_DRIVER/opencv/test$ 
  1. 设置指向opencv库文件路径的环境变量,该环境变量名为:LIBRARY_PATH,具体指令为:export LIBRARY_PATH=/usr/local/opencv430/lib:$LIBRARY_PATH,可以子终端中执行,也可以在登录用户主目录下的.bashrc文件中添加;
  2. 使用pkg-config配置文件opencv4.pc,这个方法在上面头文件处理方法时一并介绍了,在此不展开多说。

下面是在vscode中终端内的两种编译指令和程序运行截图:
在这里插入图片描述

五、小结

本文介绍了在统信UOS 的linux Debian系环境下,通过设置环境变量、编译指令参数指定路径、pkg-config配置等方法设置opencv库的头文件和库文件路径的方法,通过这些方法可以是的gcc或g++编译器能顺利找到opencv的头文件和库文件。

写博不易,敬请支持

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

更多关于统信操作系统及opencv的介绍的内容请参考专栏《国产信创之光》的其他文章。

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

老猿Python,跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

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

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

相关文章

【Vue3】创建项目的方式

1. 基于 vue-cli 创建 ## 查看vue/cli版本&#xff0c;确保vue/cli版本在4.5.0以上 vue --version## 安装或者升级你的vue/cli npm install -g vue/cli## 执行创建命令 vue create vue_test本质上使用webpack&#xff0c;默认安装以下依赖&#xff1a; 2. 基于 vite 创建 官…

心晴图谱:大学生心理健康数据探秘与画布解读

心晴图谱&#xff1a;大学生心理健康数据探秘与画布解读 1. 引言2. 数据集介绍3. 技术选型4. 分析维度与功能5. 创新点6. 可视化大屏展示7. 结论与展望 当代大学生面临着越来越多的心理健康挑战&#xff0c;而通过对某省一些高校从2018年到2022年的大学生心理健康数据进行深入分…

Spring对bean的管理

一.bean的实例化 1.spring通过反射调用类的无参构造方法 在pom.xml文件中导入坐标&#xff1a; <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.29<…

SEO中的实体:它们是什么以及为什么它们很重要?

从了解搜索历史到区分实体与关键字&#xff0c;真正了解实体是什么&#xff0c;以便获得更有针对性的搜索流量。 关于SEO专业人士应该如何理解&#xff0c;更重要的是&#xff0c;如何利用SEO中的“实体”&#xff0c;存在很多困惑。 我明白这是从哪里来的&#xff0c;尤其是…

BDD - Python Behave 配置文件 behave.ini

BDD - Python Behave 配置文件 behave.ini 引言behave.ini配置参数的类型配置项 behave.ini 应用feature 文件step 文件创建 behave.ini执行 Behave 引言 前面文章 《BDD - Python Behave Runner Script》就是为了每次执行 Behave 时不用手动敲一长串选项&#xff0c;其实还有…

【王爽老师汇编语言】os和计组必备前置知识-学习记录2

1. 应用程序的组成 从汇编语言角度&#xff0c;一个程序分为&#xff1a; 数据段 堆栈段 代码段 扩展段 应用程序从高级语言的角度比如C语言分段&#xff1a; 数据段 代码段 BSS段 栈、堆 我们可以看到一个可执行程序至少包含&#xff1a;代码段数据段BBS段 一般情况下&…

VirtualBox 网络连接配置

这几天为了确认笔记本电脑的ssd磁盘型号&#xff0c;拆开电脑查看了一下&#xff0c;并且拔出来又装回去了&#xff0c;就是这个插拔的动作&#xff0c;导致原本能好好运行的虚拟机&#xff0c;突然启动报错启动不起来了。看了启动日志&#xff0c;显示启动的时候磁盘数据校验出…

Java多线程技术五——单例模式与多线程

1 概述 本章的知识点非常重要。在单例模式与多线程技术相结合的过程中&#xff0c;我们能发现很多以前从未考虑过的问题。这些不良的程序设计如果应用在商业项目中将会带来非常大的麻烦。本章的案例也充分说明&#xff0c;线程与某些技术相结合中&#xff0c;我们要考虑的事情会…

Spring 是如何解决循环依赖问题的方案

文章目录 Spring 是如何解决循环依赖问题的&#xff1f; Spring 是如何解决循环依赖问题的&#xff1f; 我们都知道&#xff0c;如果在代码中&#xff0c;将两个或多个 Bean 互相之间持有对方的引用就会发生循环依赖。循环的依赖将会导致注入死循环。这是 Spring 发生循环依赖…

Linux安装GitLab教程

Linux安装GitLab教程 1、配置yum源 相当于新建一个文件&#xff0c;通过这个文件来安装gitlab vim /etc/yum.repos.d/gitlab-ce.repo 把这些配置粘进去 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gp…

NVIDIA GeForce Experience下载更新失败怎么办?

下载的文件会在C:\ProgramData\NVIDIA Corporation\Downloader这个目录下&#xff0c; 打开名字很长的文件夹&#xff0c;在被删除前手动安装即可。

12.27_黑马数据结构与算法笔记Java(补1)

目录 266 活动选择问题 分析 267 活动选择问题 贪心 268 分数背包问题 贪心 269 0-1 背包问题 贪心 270 斐波那契 动态规划 271 斐波那契 动态规划 降维 272 Bellman Ford 动态规划 分析 273 Bellman Ford 动态规划 实现1 274 Bellman Ford 动态规划 实现2 275 Leetco…

微信小程序开发系列-06事件

什么是事件 事件是视图层到逻辑层的通讯方式。事件可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上&#xff0c;当达到触发条件时&#xff0c;就会执行逻辑层中对应的事件处理函数。事件对象可以携带额外信息&#xff0c;如 id, dataset, touches。 事件分类 事…

使用cmake配置matplotlibcpp生成VS项目

https://gitee.com/feboreigns/matplotlibcpp 这篇文章需要一些cmake基础&#xff0c;python基础&#xff0c;visualstudio基础 准备环境 注意如果在VS平台使用必须要手动下载python&#xff0c;不能使用conda里面的&#xff0c;比如3.8版本&#xff0c;因为conda里面没有py…

Understanding Deep Image Representations by Inverting Them(2014)

文章目录 AbstractIntroductionContribution -Summary hh Abstract 从SIFT和视觉词袋到卷积神经网络(cnn)&#xff0c;图像表示几乎是任何图像理解系统的关键组成部分。然而&#xff0c;我们对它们的了解仍然有限。在本文中&#xff0c;我们通过提出以下问题对表征中包含的视觉…

Mybatis行为配置之Ⅱ—结果相关配置项说明

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL 文章目录 专栏精选引言摘要正文autoMappingBehaviorautoMappingU…

关于设计模式、Java基础面试题

前言 之前为了准备面试&#xff0c;收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文&#xff1a;https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 设计模式 单例共有几种写法&#xff1f; 细分起来就有9种&#xff1a;懒汉&#x…

【中小型企业网络实战案例 四】配置OSPF动态路由协议

【中小型企业网络实战案例 三】配置DHCP动态分配地址-CSDN博客 【中小型企业网络实战案例 二】配置网络互连互通-CSDN博客 【中小型企业网络实战案例 一】规划、需求和基本配置_大小企业网络配置实例-CSDN博客 配置OSPF 由于内网互联使用的是静态路由&#xff0c;在链路出…

第八章 JPA和缓存

1.JPA 1.1.创建User实体类 public class User {private Integer uId;private String uName;private Integer uGender;private Integer uAge;private String uLoginname;private String uPassword;private Date uBirth;private String uEmail;private String uAddress; } 1.2…

走进电子技术之光敏电阻、电位器、开关

同学们大家好&#xff0c;今天我们继续学习杨欣的《电子设计从零开始》&#xff0c;这本书从基本原理出发&#xff0c;知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例&#xff0c;可以说是全面系统地介绍了电子设计所需的知识…