CMake学习笔记:搜索第三方库及头文件路径 find_package()命令
1、find_package命令基本介绍
在实际开发过程中,经常不可避免的会使用到第三方开源库,这些开源库可能是通过apt-get install 命令自动安装到系统目录,也可能是由我们自己下载库的源码然后通过编译安装到指定目录的。
不管哪种方式安装的库文件,如果我们需要在自己的项目中使用这些库,首先面临的第一个问题就是如何找到这些库。也就是说,根据我们的需要找到指定本版的库头文件包含路径、链接库路径等,从而能够满足我们开发项目的编译链接需要。
CMake提供了find_package()命令用来查找以来包,理想情况下,一句find_package()命令就能把一整个依赖包的的头文件包含路径、库路径、库名字、版本号等情况都获取到,后续只管用就好了。但实际使用过程肯呢个会出现这样那样的问题,因此需要我们对find_package这个强大的命令有个大概的理解。
2、一个使用find_package命令的例子
例子说明:用OpenCV库举例子,示范如何通过find_package命令找到OpenCV库并配置,从而能够在我们自己的项目中调用OpenCV库,实现特定的功能。
下面的代码主要实现了利用OpenCV载入一张图片并进行显示。
opencv_test.cpp
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"#include <iostream>using namespace std;
using namespace cv;int main(){Mat image;image = imread("../flower.jpg");if(!image.data){cout <<"No image data\n";return -1;}namedWindow("Display Image", WINDOW_AUTOSIZE);imshow("Display Image", image);waitKey(0);return 0;
}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)project(opencv_example LANGUAGES CXX)# Enable C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 搜索OpenCV的头文件路径、库文件路径等信息
# REQUIRED 表示一定要找到包,否则立即停掉整个CMake
find_package(OpenCV REQUIRED) # 打印
message(STATUS " config: ${OpenCV_DIR}")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " include: ${OpenCV_INCLUDE_DIRS}")
message(STATUS " libraries: ${OpenCV_LIBS}")# 可以不用指定关于Opencv的头文件、库的搜索路径
#include_directories(${OpenCV_INCLUDE_DIRS})
#link_directories(${OpenCV_DIR})# 生成可执行二进制文件
add_executable(opencv_example main.cpp)# Link your application with Opencv libraries
target_link_libraries(opencv_example PRIVATE ${OpenCV_LIBS})
2.1 编译运行
在源码路径打开终端,执行
mkdir build
cd bild
cmake ..
make
在源码路径下放置一张图片并命名为flower.jpg,运行:
./opencv_example
2.2 编译输出与分析
执行cmak ..命令时输出为:
-- The CXX compiler identification is GNU 11.3.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /usr/local (found version "4.5.0")
-- config(OpenCV_DIR): /usr/local/lib/cmake/opencv4
-- version: 4.5.0
-- include: /usr/local/include/opencv4
-- libraries: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio
-- Configuring done
-- Generating done
-- Build files have been written to: /home/lrj/work/opencv_example/build
3、注意
CMake本身不提供任何搜索库的便捷方法,所有搜索库并给变量复制的操作必须由CMake代码完成,也就是OpenCV_DIR目录下的<PackageName>Config.cmake或Find<PackageName>.cmake的配置文件。只不过库的作者通常会提供这两个文件,以方便使用者调用。
如果这个以来保是我们自己开发的,应该如何配置这个包生成这些配置文件,从而能够被其他项目利用find_package命令来配置我们自定义的包呢?
这就需要学习如何使用Cmake封装自己软件包。(原博主暂时未更新此部分)
另外find_package命令有两种工作模式,这两种工作模式的不同决定了其搜包路径的不同,有兴趣的可以看看下面这个链接,初学者暂时学到这里,有需要再补充学习:“轻松搞定CMake”系列之find_package用法详解_zhanghm1995的博客-CSDN博客_find_package
其实还有好多东西可以学,比如target_link_libraries这个指令可以详细了解下等等。但是作为初学者,不要贪多,一定要明确自己现在学的部分是服务哪个分支,而不是一网下去什么鱼都想捞上来。
参考:
“轻松搞定CMake”系列之find_package用法详解_zhanghm1995的博客-CSDN博客
相关文章:
CMake学习笔记:搜索第三方库及头文件路径 find_package()命令
1、find_package命令基本介绍 在实际开发过程中,经常不可避免的会使用到第三方开源库,这些开源库可能是通过apt-get install 命令自动安装到系统目录,也可能是由我们自己下载库的源码然后通过编译安装到指定目录的。 不管哪种方式安装的库文…...
Vue3-黑马(一)
目录: (1)vue3-基础-环境准备 (2)vue3-基础-入门案例 (3)vue3-基础-main.ts (1)vue3-基础-环境准备 vue3的技术选型,它提供了两套API,一个是选…...
[组合数学]母函数与递推关系
文章目录 母函数---解决计数组合 球相同 盒子不同 不能是空 C n − 1 m − 1 \quad C_{n-1}^{m-1} Cn−1m−1数的拆分 递推关系常系数线性齐次递推关系常系数线性非齐次递推关系汉诺塔递推关系 母函数—解决计数 普母函数—组合问题 指母函数—排列问题 f(x) ∑ i 1 n a i…...
opencv膨胀腐蚀
OpenCV 是一个开源的计算机视觉库,它包含了许多图像处理的功能,其中膨胀和腐蚀是两种常用的形态学操作。 膨胀(Dilation):膨胀操作是将图像中的高亮区域(白色像素)扩张,从而填充低亮…...
ARM的读写内存指令与栈的应用
1.基础读写指令 写内存指令:STR MOV R1, #0xFF000000 MOV R2, #0x40000000 STR R1, [R2] 将R1寄存器中的数据写入到R2指向的内存空间 需注意,此命令是将R1中的数据写给R2所指向的内存空间,而不是直接把R1的数据赋给R2,R2寄存器…...
2022年平均工资出炉,IT行业又是第一
根据5月9日国家统计局最新资料显示,2022年,全国城镇非私营单位就业人员年平均工资为114029元,比上年增长6.7%,扣除通胀后实际增长4.6%。其中,行业间的差距相当明显。根据资料显示,2022年无论是在私营单位还…...
ov2640子设备核心操作详细分析
ov2640子设备核心操作详细分析 文章目录 ov2640子设备核心操作详细分析ov2640_subdev_core_ops核心操作获取寄存器值ov2640_g_register设置寄存器值ov2640_s_registeri2c_smbus_xferi2c_imx_xferi2c_smbus_xfer_emulatedi2c_transfer__i2c_transfer 设置ov2640的电源ov2640_s_p…...
MATLAB语句实现方阵性质的验证
系列文章目录 MATLAB绘图函数的相关介绍——海底测量、二维与三维图形绘制 MATLAB求函数极限的简单介绍 matlab系统环境思维导图 文章目录 系列文章目录 1. MATLAB语句验证方阵的六个性质如下 2. 六个性质的解释如下 3. 使用随机矩阵进行验证的代码示例如下 总结 前言 …...
使用Springboot AOP进行请求接口异常监控
常用注解 Aspect 切面类 Before 前置 AfterReturning 后置 Around 环绕 AfterThrowing 异常 切入点设置 execution(public * *(..)) 定义任意公共方法的执行 execution(* set*(..)) 定义任何一个以"set"开始的方法的执行 execution(* com.sys.service.UserService…...
【云原生|Kubernetes】05-Pod的存储卷(Volume)
【云原生Kubernetes】05-Pod的存储卷(Volume) 文章目录 【云原生Kubernetes】05-Pod的存储卷(Volume)简介Volume类型解析emptyDirHostPathgcePersistentDiskNFSiscsiglusterfsceph其他volume 简介 Volume 是Pod 中能够被多个容器访问的共享目录。 Kubern…...
Python实现数据结构
文章目录 一、Python实现数据结构1.1 python实现单向链表1.2 python实现单向循环链表1.3 python实现双向链表 一、Python实现数据结构 1.1 python实现单向链表 singleLinkedList.py class SingleNode:"""the node of single link list"""def …...
esp32CAM环境安装教程---串口驱动安装
前言 (1)本人安装好arduino 的ESP32环境之后, 发现一直下载不进去程序。一直说Cannot configure port, something went wrong. Original message: PermissionError。 (2)查阅了很多资料,用了各种办法&#…...
Java中List和Array转换
文章目录 List -> Array1. 调用toArray()方法直接返回一个Object[]数组:2. 给toArray(T[])传入一个类型相同的Array,List内部自动把元素复制到传入的Array中:3. 通过List接口定义的T[] toArray(IntFunction<T[]> generator)方法&…...
如何能确定数据库中root用户的密码是什么
如果您无法确定数据库中 root 用户的密码,有几种方法可以尝试找回或重置密码: 1. 使用已知密码:如果您有之前设置的 root 用户密码,可以使用该密码进行登录。 2. 查找密码文件:在某些情况下,MariaDB 可能…...
由浅入深Netty协议设计与解析
目录 1 为什么需要协议?2 redis 协议举例3 http 协议举例4 自定义协议要素4.1 编解码器4.2 什么时候可以加 Sharable 1 为什么需要协议? TCP/IP 中消息传输基于流的方式,没有边界。 协议的目的就是划定消息的边界,制定通信双方要…...
iptables防火墙(1)
iptables防火墙 一、iptables概述二、netfilter/iptables 关系三、四表五链1.四表2.五链 四、规则链之间的匹配顺序五、规则链内的匹配顺序六、iptables安装与配置七、常用的控制类型八、常用的管理选项九、规则命令1.添加新规则2.查看规则列表3.设置默认策略4.删除规则5.清空规…...
第九章 Productions最佳实践 - Productions开发的最佳实践
文章目录 第九章 Productions最佳实践 - Productions开发的最佳实践Productions开发的最佳实践项目目标项目交付文档 第九章 Productions最佳实践 - Productions开发的最佳实践 Productions开发的最佳实践 本章是一个总体概述,旨在帮助团队成员为从事生产项目做好…...
RocketMQ 怎么实现的消息负载均衡以及怎么能够保证消息被顺序消费
一、RocketMQ 怎么实现的消息负载均衡 RocketMQ是一种开源的分布式消息中间件,它使用了一种称为消息负载均衡的机制来实现消息的分发和消费的负载均衡。RocketMQ的消息负载均衡主要是通过以下两个方面实现的: 消息队列分组(Message Queue G…...
【随笔记】全志 T507 PF4 引脚无法被正常设置为中断模式的问题分析
相关信息 硬件平台:全志T507 系统版本:Android 10 / Linux 4.9.170 问题描述:PF4 无法通过标准接口设置为中断模式,而 PF1、PF2、PF3、PF5 正常可用。 分析过程 一开始以为是引脚被其它驱动占用引起,或者该引脚不具…...
人手一个 Midjourney,StableStudio 重磅开源!
人手一个 Midjourney,StableStudio 重磅开源! Stability AI 公司在上个月 19 号推出了 Alpha 版本 StableLM 大语言模型,包含了 30 亿和 70 亿参数,并且支持商用。如今他们再次推出了 AI 图像生成平台 StableStudio,这…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
