CMake入门教程【核心篇】查找包(find_package)
😈「CSDN主页」:传送门
😈「Bilibil首页」:传送门
😈「本文的内容」:CMake入门教程
😈「动动你的小手」:点赞👍收藏⭐️评论📝
文章目录
- 1.使用方法
- 1.1基本用法
- 1.2导入软件包的设置:
- 1.3自定义软件包的查找路径:
- 1.4使用 Find 模块文件:
- 1.5设置软件包的变量:
- 2.示例
- 2.1查找并导入 OpenCV 软件包:
- 2.2查找并导入 Boost 软件包的特定组件:
- 2.3查找自定义的 Find 模块文件:
- 3.find_package的查找目录
1.使用方法
1.1基本用法
find_package
是 CMake 中用于查找和加载外部软件包的命令。它可以用于查找已经安装在系统中的软件包,并将其相关的设置导入到 CMake 构建系统中。下面是find_package
的一些常见用法和技巧:
find_package(<package> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [COMPONENTS <components>])
<package>
是要查找的软件包的名称version
是软件包的版本号(可选)。EXACT
选项可指定要求精确的版本匹配。QUIET
选项可使命令在查找失败时不产生错误信息。MODULE
选项用于指定要查找的模块文件。REQUIRED
选项表示软件包是必需的,如果找不到将会引发错误。COMPONENTS
选项用于指定软件包的组件。
1.2导入软件包的设置:
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])
if(<package>_FOUND)include_directories(${<package>_INCLUDE_DIRS})target_link_libraries(<target> ${<package>_LIBRARIES})
endif()
在找到软件包后,可以使用
${<package>_INCLUDE_DIRS}
和${<package>_LIBRARIES}
变量来导入软件包的头文件路径和库文件路径,并将其添加到相应的构建目标中。
1.3自定义软件包的查找路径:
set(<package>_DIR <path>)
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])
可以使用
set(<package>_DIR <path>)
命令来设置软件包的查找路径,其中<path>
是软件包的安装路径。这样,find_package
命令将会在指定的路径下查找软件包。
1.4使用 Find 模块文件:
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} <path>)
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])
可以使用
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} <path>)
命令将自定义的 Find 模块文件所在的路径添加到 CMake 模块搜索路径中。然后,find_package
命令将会在指定的路径下查找模块文件。
1.5设置软件包的变量:
set(<package>_DIR <path>)
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])
if(<package>_FOUND)message("Found <package>: ${<package>_VERSION}")
endif()
在找到软件包后,可以使用
${<package>_VERSION}
变量来获取软件包的版本信息,并进行相应的处理。
2.示例
2.1查找并导入 OpenCV 软件包:
find_package(OpenCV 4.2.0 REQUIRED)
if(OpenCV_FOUND)include_directories(${OpenCV_INCLUDE_DIRS})target_link_libraries(my_project ${OpenCV_LIBRARIES})
endif()
在此示例中,我们使用
find_package
命令来查找 OpenCV 软件包,并指定所需的最低版本为 4.2.0。如果找到了 OpenCV,我们将导入其头文件路径和库文件路径,并将其链接到名为my_project
的目标中。
2.2查找并导入 Boost 软件包的特定组件:
find_package(Boost 1.75.0 REQUIRED COMPONENTS filesystem system)
if(Boost_FOUND)include_directories(${Boost_INCLUDE_DIRS})target_link_libraries(my_project ${Boost_LIBRARIES})
endif()
在此示例中,我们使用
find_package
命令来查找 Boost 软件包,并指定所需的最低版本为 1.75.0。我们还指定了需要的组件,即filesystem
和system
。如果找到了 Boost,并且所需的组件也可用,我们将导入其头文件路径和库文件路径,并将其链接到my_project
目标中。
2.3查找自定义的 Find 模块文件:
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} /path/to/FindCustomPackage.cmake)
find_package(CustomPackage REQUIRED)
if(CustomPackage_FOUND)include_directories(${CustomPackage_INCLUDE_DIRS})target_link_libraries(my_project ${CustomPackage_LIBRARIES})
endif()
在此示例中,我们将自定义的 Find 模块文件的路径添加到 CMake 模块搜索路径中,并使用
find_package
命令来查找名为CustomPackage
的软件包。如果找到了 CustomPackage,我们将导入其头文件路径和库文件路径,并将其链接到my_project
目标中。
3.find_package的查找目录
find_package
命令在 CMake 中用于查找和加载外部库或软件包。它按照特定的顺序在多个目录中搜索指定的软件包。这些搜索目录包括:
- CMake变量指定的路径:
CMAKE_PREFIX_PATH
:一个或多个路径的列表,CMake会在这些路径下查找软件包。<PackageName>_DIR
:对于特定软件包,可以设置一个变量来指定其配置文件的路径(例如,对于Foo
包,设置Foo_DIR
)。
- 系统默认路径:
- 在 Unix-like 系统上,通常包括
/usr/local
、/usr
等标准安装路径。 - 在 Windows 系统上,可能包括一些特定于 Windows 的标准路径,如程序安装目录。
- 在 Unix-like 系统上,通常包括
- 环境变量指定的路径:
CMAKE_SYSTEM_PREFIX_PATH
:系统环境变量指定的路径列表,例如在 Unix 系统上可能包括/usr/local/
等。- 其他特定于系统的环境变量,如
LD_LIBRARY_PATH
或PATH
。
- CMake模块路径:
CMAKE_MODULE_PATH
:这个变量可以用来指定自定义的“Find模块”的路径。通过将自定义模块路径添加到这个变量,可以让find_package
使用这些自定义模块来查找软件包。
- 预定义的CMake模块:
- CMake还包含了一组预定义的模块,这些模块定义了常用软件包的查找逻辑。这些模块通常位于 CMake 安装目录的
Modules
子目录中。
- CMake还包含了一组预定义的模块,这些模块定义了常用软件包的查找逻辑。这些模块通常位于 CMake 安装目录的
find_package
首先尝试使用配置模式(即查找软件包提供的配置文件,如FooConfig.cmake
或foo-config.cmake
),如果失败,则回退到模块模式(使用 CMake 提供或自定义的 Find 模块,如FindFoo.cmake
)。
正确设置这些路径可以确保 CMake 能够在预期的位置找到所需的软件包
相关文章:

CMake入门教程【核心篇】查找包(find_package)
😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.使用方法1.1基本用…...

Stable Diffusion好用的显卡推荐
Stable Diffusion 是一款顶级的人工智能艺术生成工具,以其快速的性能、用户友好的界面和显着的效果而闻名。然而,在沉浸体验之前,有必要验证您的计算机(显卡)是否符合最佳功能所需的严格规范。今天我们将介绍三款高性价…...
Spring 对请求参数的优雅处方式(重写序列化方法)
Spring 对请求参数的优雅处方式(重写序列化方法) 描述前端传参方式介绍代码实现:1、重写序列化方式代码2、设置类自动加载到 Spring 中 描述 在我们日常项目开发过程中,往往会遇到前端请求参数中有空格的情况,前端提交…...

2024年中职“网络安全“—数字调查取证(attack817.pcapng)
目录 1.通过分析数据包找出恶意用户最初访问HTTP服务的包号,将该值作为Flag值提交, Flag格式为flag{xxx}; 2.继续查看数据包文件分析出恶意用户扫描了哪些端口,将全部的端口号按照一定顺序作为Flag值,提示:注意端口…...

如何使用VsCode编译C语言?
下载VsCode (1) 解压到D盘跟目录 (2) 运行[vscode.reg],注册右键菜单 (3) 进入[pack]文件夹,运行[install.bat]。安装基本插件。 下载mingw32 (1) 解压任意目录 (2) 我的电脑右键–高级系统设置–高级–环境变量–系统变量–Path(双击)–空白行(双击)–…...

SpringCloud 和 Linux 八股文第三期五问五答
SpringCloud 和 Linux 八股文第三期五问五答 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的! ⭐点赞⭐收藏⭐不迷路!⭐ 1)Linux常用命令 2)如何查看测试项目的日志 一…...
组件通信方式
组件通信方式有:vuex,ref,父子通信(父传子、子传父),兄弟通信(eventBus), 祖先后代通信(依赖注入) 父传子:父组件内:在子组件标签上设置自定义属…...

kbdnecnt.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复?
不少人都在问“kbdnecnt.DLL文件”是什么?为什么电脑总是报错提示说“kbdnecnt.DLL文件缺失,软件无法启动”? 首先,先来了解“kbdnecnt.DLL文件”是什么? kbdnecnt.DLL是Windows操作系统中的一个动态链接库文件&#…...
Linux账户安全
一.Linux账户与组的基本概念 在Limux操作系统中,每一个文件和程序都归属于一个特定的 “用户”。每个用户都由一个唯一的身份来标识,这个标识称为用户ID (UserID, UID )。系统中的每一个用户也至少需要属于一个“用户分组”,即由系统管理员所…...

深度生成模型之GAN优化目标设计与改进 ->(个人学习记录笔记)
文章目录 深度生成模型之GAN优化目标设计与改进原始GAN优化目标的问题1. JS散度度量问题2. 梯度问题 优化目标的设计与改进1. 最小二乘损失GAN2. Energy-based GAN(EBGAN)3. Wasserstein GAN4. WGAN-GP5. Boundary Equilibrium GAN(BEGAN)6. Loss Sensitive GAN7. Relativeisti…...

程序员如何高效学习技术?
我们相信努力学习一定会有收获,但是方法不当,既让人身心疲惫,也没有切实的回报。 不少朋友每天都阅读技术文章,但是第二天就忘干净了。工作中领导和同事都认可你的沟通和技术能力,但是跳槽面试却屡屡碰壁。面试官问技术…...

一个无经验的大学毕业生,可以转行做软件测试吗?我的真实案例
在转行之前,我一直在思考,当代年轻人的真实生活情况究竟是什么样的。 朝九晚六,无休止的加班,每天往返于公司与家,没有一点点自己的生活,只能从心里面麻痹自己,以求得最后的慰籍。 这就是我之…...
三.Linux无名管道(PIPE)和有名管道(FIFO)的区别
目录 命名管道(Named Pipe): 无名管道(Anonymous Pipe): 总结: 无名管道(Anonymous Pipe)和命名管道(Named Pipe)都是进程间通信的机制&#x…...
英文字母替换加密(后移n位)
思路:首先写出后移(前移)1位的情况 , 然后逐渐累加至N位情况 #include <stdio.h> void test(char arr[] , int n ) { int i 0; int z 0; if( n < 0 ) { while( i ! n ) { …...
HAproxy群集
HAproxy群集 常见的集群调度器HAproxy 、nginx、LVS区别HAproxynginxlvs HAproxy介绍HAproxy特点HAproxy常见的负载均衡策略HAproxy会话保持HAproxy配置实例 常见的集群调度器 常见的web集群调度器分为软件和硬件 软件:LVS Haproxy nginx 硬件: F5 Ar…...
LeetCode2469. Convert the Temperature
文章目录 一、题目二、题解 一、题目 You are given a non-negative floating point number rounded to two decimal places celsius, that denotes the temperature in Celsius. You should convert Celsius into Kelvin and Fahrenheit and return it as an array ans [ke…...

【ROS2】MOMO的鱼香ROS2(五)ROS2入门篇——ROS2接口与自定义
ROS2接口与自定义 引言1 ROS2自带接口1.1 ROS2通用标准消息包1.2 ROS2传感器消息包1.3 ROS2几何相关消息包 2 ROS2接口介绍2.1 常用CLI命令2.2 原始数据类型与包装类型 3 自定义接口示例3.1 接口定义3.2 自定义接口RCLPY 引言 笔者跟着鱼香ROS的ROS2学习之旅 学习参考…...

python c语言 代码动态检查,python c语言语法分析
大家好,小编来为大家解答以下问题,python c语言 代码动态检查,python c语言语法分析,今天让我们一起来看看吧! Source code download: 本文相关源码 初学编程,应该学习哪一门编程语言,有不少人感…...

C++ DAY6 作业
1.用模板类写顺序表 #include <iostream>using namespace std;#define MAXSIZE 10 template <typename T> class Arr {T *data NULL;int len 0; public://构造函数Arr():data(new T){}Arr(T a,int len):data(new T(a)),len(len){}//析构函数~Arr(){delete data;}…...

华为服务器安装银河麒麟V10操作系统(IBMC安装)
iBMC是华为面向服务器全生命周期的服务器嵌入式管理系统。提供硬件状态监控、部署、节能、安全等系列管理工具,标准化接口构建服务器管理更加完善的生态系统。 服务器BMC IP:192.168.2.100 一、准备工作 1、确保本机和服务器BMC管理口在同一网络 2、银…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...