CMake find_package语法

【cmake学习】find_package 详解 阅读详情

1. find_package常用指令形式

该指令是用来搜索包,并将包头文件、库文件、包目录记录下来;

find_package常用形式为

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [NO_POLICY_SCOPE])

其中

  • < PackageName > 包名,必填参数。注意大小写。
  • [version] 指定版本,可选参数。添加该参数后会检查找到的包的版本是否和version兼容。
  • [EXACT] 版本号必须匹配,可选参数。必须完全匹配的版本而不是兼容版本就可以。
  • [QUIET] 没找到包也没关系;可选参数。
  • [REQUIRED] ,没找到包会停止CMake;可选参数,会覆盖掉 [QUIET] 参数,输出查找失败提示语。
  • [MODULE]:可选字段。CMake有两个包查找模式,指定查找模式为MODULE模式,只在MODULE查找。
  • [COMPONENTS],[components]:可选字段,表示查找的包中必须要找到的组件(components),如果有任何一个找不到,CMake停止执行。

2. find_package两种包查找模式

在第一章了解了find_package语法后,下面需要了解一下find_package的内部实现机制,了解find_packge是如何查找包的;
主要有两种包查找模式:MODUEL模式和CONFIG模式。

2.1 MODULE模式

MODULE模式为 命令基础工作模式(Basic Signature),也是默认工作模式。

2.1.1 Find< PackageName>.cmake文件

Module模式主要依赖于查找到名为Find.cmake的配置文件。在Find.cmake配置文件中会将以下几个CMake变量赋值:

<LibaryName>_FOUND # 是否找到对应包
<LibaryName>_INCLUDE_DIR or <LibaryName>_INCLUDES #将找到的包的头文件保存在变量中
<LibaryName>_LIBRARY or <LibaryName>_LIBRARIES #将找到的包的库文件保存在变量中

2.1.2 Find< PackageName>.cmake是什么

.cmake文件是什么?
.cmake 是给cmake执行用的,可认为是cmake的一种执行脚本
Find< PackageName>.cmake 是什么
cmake执行,用于查找包的脚本;执行完成后会赋值几个变量

<LibaryName>_FOUND # 是否找到对应包
<LibaryName>_INCLUDE_DIR or <LibaryName>_INCLUDES #将找到的包的头文件保存在变量中
<LibaryName>_LIBRARY or <LibaryName>_LIBRARIES #将找到的包的库文件保存在变量中

Find< PackageName>.cmake 哪里来?
1.CMake官方会内置一些常用的Find< PackageName>.cmake文件 方便用户使用。
2.别人做好的包一般会提供该文件(反正这个文件不是你作为包的使用者来写出来的)。

cmake官方为我们预定义的Find< PackageName>.cmake,存储在path_to_your_cmake/share/cmake-/Modules目录下。
可以直接使用指令查询CMake内置了哪些模块:
cmake --help-module-list | grep -E ^Find
·
下图是我电脑上存在的一些CMake
这是我的路径D:\Program Files (x86)\cmake\cmake-3.20.1-windows-x86_64\share\cmake-3.20\Modules
在这里插入图片描述

2.1.3 查找.cmake文件

前面介绍可知,基本上所有的Find< PackageName>.cmake均会在CMake安装路径下的Modules目录;因此Module模式在find_package肯定会从上述路径查找对应的.cmake文件。除此外我们还可以在CMakeLists.txt中设置CMAKE_MODULE_PATH变量,指定Find< PackageName>.cmake的查找路径。
只需记住find_package只有两个查找路径:CMAKE_MODULE_PATH和CMake安装路径下的Modules目录;
对应CMakeLists.txt变量名为:

CMAKE_MODULE_PATH
CMAKE_ROOT

搜包路径次序依次为:

  1. 先在CMAKE_MODULE_PATH变量对应的路径中查找。
  2. 如果路径为空,或者路径中查找失败,则在CMake安装目录(即CMAKE_ROOT变量)下查找。

这两个变量可以在CMakeLists.txt文件中打印查看具体内容:

message(STATUS “CMAKE_MODULE_PATH = ${CMAKE_MODULE_PATH}”)
message(STATUS “CMAKE_ROOT = ${CMAKE_ROOT}”)

其中CMAKE_MODULE_PATH默认为空,可以利用set命令赋值。

2.2 CONFIG模式

如果MODULE模式下查找失败,一般情况下会自动转到Config模式进行包搜索;
config模式下,find_package的指令语法也更多:

find_package(<package> [version] [EXACT] [QUIET]
             [REQUIRED] [[COMPONENTS] [components...]]
             [CONFIG|NO_MODULE]
             [NO_POLICY_SCOPE]
             [NAMES name1 [name2 ...]]
             [CONFIGS config1 [config2 ...]]
             [HINTS path1 [path2 ... ]]
             [PATHS path1 [path2 ... ]]
             [PATH_SUFFIXES suffix1 [suffix2 ...]]
             [NO_DEFAULT_PATH]
             [NO_CMAKE_ENVIRONMENT_PATH]
             [NO_CMAKE_PATH]
             [NO_SYSTEM_ENVIRONMENT_PATH]
             [NO_CMAKE_PACKAGE_REGISTRY]
             [NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.
             [NO_CMAKE_SYSTEM_PATH]
             [NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
             [CMAKE_FIND_ROOT_PATH_BOTH |
              ONLY_CMAKE_FIND_ROOT_PATH |
              NO_CMAKE_FIND_ROOT_PATH])

Config模式是通过另外一种.cmake文件来进行查找依赖库的:
<LibraryName>Config.cmake或者< lower-case-package-name>-config.cmake
这个文件从哪里来?
安装第三方库时,会自动在系统目录生成一份,因此有时没有指定搜索路径时也可以正确引用包
有的包安装时会在cmake/XXXX/目录下生成上述文件,有的会直接将对应文件所在目录添加到环境变量PATH中,这两个都是find_package的搜索路径

2.1.3 查找.cmake文件

具体查找顺序为:
1、名为_DIR的CMake变量或环境变量路径;默认为空,非根目录:
必须要指定到Config.cmake或-config.cmake文件所在目。
2、名为CMAKE_PREFIX_PATH、CMAKE_FRAMEWORK_PATH、CMAKE_APPBUNDLE_PATH的CMake变量或环境变量路径;默认为空,根目录。
3、PATH环境变量路径;根目录;
这个路径的查找规则为:
遍历PATH环境变量中的各路径,如果该路径如果以bin或sbin结尾,则自动回退到上一级目录得到根目录。

根目录的查找规则:
CMake会首先检查根目录路径下是否有名为Config.cmake或-config.cmake的模块文件,如果没有,CMake会继续检查或匹配这些根目录下的以下路径

/(lib/|lib|share)/cmake//
/(lib/|lib|share)/
/
/(lib/|lib|share)/*/(cmake|CMake)/

其中为系统架构名,如Ubuntu下一般为:/usr/lib/x86_64-linux-gnu,整个(lib/|lib|share)为可选路径,例如OpenCV库而言会检查或匹配

  • < prefix>/OpenCV/
  • < prefix>/lib/x86_64-linux-gnu/OpenCV/
  • < prefix>/lib/share/OpenCV/
  • < prefix>/share/OpenCV/等路径;

name为包名,不区分大小写,*意思是包名后接一些版本后等字符也是合法的,如pcl-1.9也会被找到。

参考文章:
https://blog.youkuaiyun.com/zhanghm1995/article/details/105466372

CMake I 细谈find_package函数 find_package()有Module模式和Config模式。 pkg-config 阅读详情

相关推荐

CMake系列之深入解析find_package的使用方法

如果找到了满足条件的Boost库,CMake会将其设置为变量Boost_FOUND,并提供一系列的变量来描述Boost库的位置和编译选项。对于自定义的CMake模块,我们可以通过设置CMAKE_MODULE_PATH变量来告诉CMake在指定的路径中查找模块文件,然后使用find_package命令来加载模块中定义的依赖库。在这个示例中,我们将自定义模块文件所在的路径添加到CMAKE_MODULE_PATH变量中,然后使用find_package命令来加载MyModule模块中定义的依赖库。

KgCrystal的博客 352

【CMake】find_package 命令

如果没有使用[version]选项,没有给出需要的包组件列表,就会使用外部调用的相应参数(包括[version]的EXACT选项)。参考链接:https://blog.youkuaiyun.com/challenglistic/article/details/130138476。对于必须的包组件可以在 COMPONENTS 选项后列出(如果使用了REQUIRED选项,也可以在REQUIRED选项后列出)。用于指定要查找的包的版本(版本格式为major[.minor[.patch[.tweak]]])。

DMLearner的博客 590

【Tools系列】CMake入门基础(1):CMake语法

Date: 2022.3.28 文章目录前言1、CMake简介2、CMake常用命令和语法2.1、set2.2、include2.3、include_directories2.4、option2.5、list2.6、string2.7、find_program2.8、find_package2.9、execute_process2.10、configure_file2.11、add_definitions:2.12、find_library2.13、add_subdirectory2.14、add_exe

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 716

FIND_PACKAGE之REQUIRED和QUIET

使用REQUIRED确保依赖包必须被找到。使用QUIET可以抑制查找包时的一些标准输出信息。可以同时使用这两个选项来同时满足需求和减少不必要的输出。

格物致知的专栏 [音视频编解码 网络协议 计算机视觉 计算机图形学 图像理解 语音识别 机器学习 模拟电路 传感器] 738

UWB学习——day4

总的来说,BPM-BPSK调制方案是一种利用脉冲位置和相位来编码信息的高效数字调制技术,特别适用于UWB通信系统,以实现高速数据传输和频谱效率。这种方式将时间和相位综合使用,从而提高了数据传输的容量。总之,超外差结构是一种接收器设计,通过将不同频率的信号转换到一个共同的中间频率来提高信号选择性和抗干扰性。超外差结构是一种用于接收器的电子电路设计,它的目标是从无线信号中提取有用的信息,比如音频、数据或图像。该芯片的接收机是超外差结构,所谓超外差结构一种基于频率转换的接收器架构,旨在提高信号选择性和抗干扰性。

许帅的博客 2557

【鸿蒙南向开发】OpenHarmony音频驱动audio适配方案

这份鸿蒙(HarmonyOS NEXT)文档包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS_666的博客 4513

cmake学习(二)引用外部库(find_package分析)

案例:lio-sam-linux项目的CMakeLists.txt 通过这个例子学习一下引用外部库的相关内容。 (貌似项目本身的构建结构不太符合规范,这个后面再修改。,。) 项目路径: CMakeLists.txt cmake_minimum_required(VERSION 2.8.3) project(lio_sam_linux) #set命令可以设置普通变量、缓存条目、环境变量三种变量的值。 set(CMAKE_BUILD_TYPE "Release") set(CMAKE_CXX_FLAGS "

qq_38170211的博客 1655

免费搞定DWG转DXF:ODA File Converter保姆级配置指南(附常见报错解决)

本文详细介绍了如何使用ODA File Converter免费工具实现DWG到DXF的格式转换,包括环境配置、命令行参数解析、编程集成方案及常见问题解决。特别针对网络访问异常、参数配置等实际痛点提供应对策略,帮助用户高效完成工程设计文件的格式转换。

weixin_29291185的博客 6018

find_package深度解析及实例应用

默认情况下,包括两个端点。如果传递了NO_PACKAGE_ROOT_PATH,或者将CMAKE_FIND_USE_PACKAGE_ROOT_PATH设置为FALSE,则可以跳过此操作。/*/(lib/|lib*|share)/cmake/*/就表示可能在/lib/cmake/或者/lib*/cmake/或者/share/cmake/目录下.可以通过NO_CMAKE_PATH选项或将CMAKE_FIND_USE_CMAKE_PATH设置为FALSE来跳过。

qq_39466755的博客 2642

【社区分享】从零开始学习 TinyML,建立 TensorFlow 深度学习模型(技术优化篇)

本文来自社区投稿与征集,作者王玉成,ML&IoT Google Developers Expert,温州大学智能锁具研究院总工程师。 了解更多:https://blog.youkuaiyun.com/wfing 经过前面几章的讨论,我们了解了TinyML 的概念,完成了一个最简单的TinyML 的模型并且运行在微控制器上,得出最基本的结果。但是在实际的工程应用中,模型建立之后,也需要再进一步结合许多优化方面的技术,这就是我们接下来想要探讨的。 5. 优化 TinyML 这本书也详细的向我...

tensorflowforum的博客 1万+

搞定8GB/s数据流:一个FPGA工程师的XDMA驱动调优实战(附避坑清单)

本文详细记录了FPGA工程师在XDMA驱动调优过程中实现8GB/s高带宽数据流的实战经验。通过优化DDR访问、中断响应、DMA映射等关键环节,解决了PCIE数据采集卡在高带宽场景下的性能瓶颈,并提供了实用的避坑清单和技术方案。

weixin_29194255的博客 203

CMake语法之find_package

参考:Cmake之深入理解find_package()的用法 参考博客写的非常好,推荐仔细看博客。另外博客中有github代码链接,可以参考代码进行理解。 总结来说find_package命令有两种模式: Module模式 : cmake需要找到一个叫做Find<LibraryName>.cmake的文件。这个文件负责找到库所在的路径,为我们的项目引入头文件路径和库文件路径。cmake搜索这个文件的路径有两个,一个是cmake安装目录下的share/cmake-<version>

qq_42731705的博客 1370

解决VMWare ESXi PCIe直通显卡导致的DevicePowerOn启动故障

本文详细解析了VMWare ESXi中PCIe直通显卡导致的DevicePowerOn启动故障,重点分析了MMIO空间不足的根本原因,并提供了完整的解决方案。通过修改.vmx文件中的关键参数,如pciPassthru.64bitMMIOSizeGB,可以有效解决显存分配问题。文章还涵盖了硬件兼容性检查、性能调优技巧及大规模部署的实战案例,帮助用户彻底解决显卡直通难题。

weixin_42537919的博客 575

cmake find_package的基本原理与详细示例(一)

一、find_package可以解决的问题 当构建一个依赖第三库或外部库的project时(即:project需要链接第三方库或外部库),我们需要知道以下信息: 去哪儿找第三 方库的头文件 .h 对比GCC的 -I 参数 去哪儿找第三方库的链接文件 (.so/.dll/.lib/.dylib/…) 对比GCC的 -L 参数 链接的第三方库的文件的名字 对比GCC的 -l 参数 知道上面的信息后,就可以在CMakeLists.txt中方便的包含第三方库的头文件、访问的链接第三

哦,原来你也在这里。 5620

SAP 中租赁资产的实现需区分经营租赁与融资租赁,核心围绕资产主数据配置、折旧与利息设置、科目分配及业务操作展开

摘要:SAP系统租赁资产管理需区分经营租赁与融资租赁,通过SPRO配置资产主数据、折旧范围、利息计算及科目分配。关键步骤包括:激活折旧范围利息计算(OABZ)、设置租赁资产类别(OAYZ)、维护总账科目(AO90)及创建租赁资产主数据(AS01)。业务操作涵盖资产资本化(ABZON)、折旧利息过账(AFAB)、租金支付(F-53)及终止处理(ABUMN)。核心配置要点在于准确设置租赁类型、利率参数和科目联动,确保系统自动计算折旧与利息并生成正确凭证。

金牌架构师 1073

拼多多Android面试题及参考答案

Android 系统采用分层架构设计,从底层到上层依次为Linux 内核层硬件抽象层(HAL)系统运行时库层应用框架层应用层,共五层。位置:Linux 内核层与系统运行时库层之间,是“硬件与系统的隔离层”。核心作用:屏蔽硬件差异,为上层提供统一的硬件访问接口,解决 Android 开源与硬件厂商闭源的矛盾,具体功能如下:硬件能力抽象:将硬件的具体实现(如不同厂商的摄像头芯片、音频芯片)封装为标准化接口(如Camera HALAudio HAL。

大模型大数据攻城狮的专栏 1284

CMake语法-find_package-查找库-pkg_check_modules-外部库信息-find_path-查找路径-find_library-查找库

CMake已经完善成一门比较全面的编译型脚本语言,能够执行大部分文件搜索,库搜索等预处理操作。

插件开发 2210

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

GoogleTest 入门(2) CMake 项目中引入 GTest

文章目录0. 前言1. 方式一:完全不使用CMake特殊语法2. 方式二:ctest3. 方式三:find_package4. 方式四:使用 CMake 中 GTest 相关的特殊语法 0. 前言 场景很简单:自己的项目中创建了一系列单元测试,如何引入 GTest,如何执行测试。 准备工作: git clone https://github.com/google/googletest.git cd googletest mkdir build && cd build &&

清欢 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

CMake find_package命令(查找包)

本文作者:黄邦勇帅(原名:黄勇),QQ:42444472 (读者意见可发至QQ)本系列文章是对**《C++语法详解》和《Qt5.10 GUI完全参考手册》**的增补,以增加读者对构建C++程序底层的了解。主要对Makefile和CMake进行讲解,文章由浅入深,浅显易懂,看似简单却很有深度,是一本难得的比较全面的深入且细致的讲解Makefile和CMake的文章。本系列文章主要参考文献为Microsoft官方文档,GNU make官方文档,CMake官方文档。

黄邦勇帅的博客 563

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

CMake: find_package函数介绍和使用

是 CMake 中用于查找和加载外部依赖库的核心函数。它会根据指定的包名,在系统中查找已安装的库及其配置文件,并将找到的信息存储在特定的变量中,供后续使用。的内容会输出到控制台,告诉你 CMake 在哪里找到了库的配置文件。打印变量和上述路径设置方法,可以有效地定位和解决。配置阶段)告诉你它在哪里找到了某个包,可以使用。执行后,主要设置以下变量(具体变量名取决于。如果你想让 CMake 在运行时(或在。

weixin_42849849的博客 1257

cmake之find_package命令详解

find_package是cmake用来管理第三方库的一个命令。

new9232的博客 3769

[cmake] --- find_package

find_package指令有两种查找包的模式:模块模式(Module mode)和配置模式(Config mode)。模块模式(Module mode):在模块模式下,find_package会在指定的路径中查找名为 < package >-config.cmake的文件。如果找到了这个文件,那么它会将该文件所在的目录添加到包含目录中,并生成相应的变量,如< package>_INCLUDE_DIRS、< package>_LIBRARIES等。这样,你就可以在项目中使用这个包提供的头文件和库文件了。

M2嵌入式 2149

cmake:find_package 添加依赖库

此文为:轻松入门cmake系列教程 引入库文件时,我们必须知道头文件的路径还有库文件的路径 在cmake某个程序的时候,经常会提示找不到某个所依赖的库,那么这是时候我们就需要检查我们引入依赖库的路径对不对了, Cmake中一个自动寻找函数find_package()可以帮我们实现这个功能。 实践 例子1:opencv CMakeFileLists.txt find_package( OpenCV REQUIRED ) if (OpenCV_FOUND) include_directories( ${O.

OceanStar的博客 6463

在 CMake 中,find_package 是一个用于查找外部库或包的命令

是 CMake 中非常重要的命令,用于管理项目对外部库和包的依赖。Config 模式是推荐的模式,特别是在使用现代 CMake 时。它使得你的 CMake 构建系统可以依赖于其他库或工具,并自动设置相关的编译和链接参数。如果找到了这个文件,CMake 就会执行该文件,通常这个文件会设置与库相关的变量(如。是配置现代 CMake 项目的关键部分,特别是当你希望你的项目能够使用或依赖于第三方库时。之后,通常会设置一组与包相关的变量,你可以在之后的 CMake 脚本中使用这些变量。在 CMake 中,

m0_46376834的博客 1087

CMake介绍

文章目录前言一、什么是cmake?二、cmake快速使用例子三、CMake关键字介绍project关键字set关键字message关键字add_executable关键字target_include_directories关键字链接库target_link_librariesadd_subdirectory 指令更改二进制的保存路径安装静态库和动态库的构建任务:find_package包含第三方库三、CMake语法1.语法的基本原则2.语法注意事项3.内部构建和外部构建四、CMake构建级别 前言 提示:

qq_44074143的博客 2万+

CMake指令入门 ——以构建OpenCV项目为例

CMake指令入门 转自:https://blog.youkuaiyun.com/sandalphon4869/article/details/100589747 一、安装 sudo apt-get install cmake 安装好后,输入 cmake -version 如果出现了cmake的版本显示,那么说明安装成功 二、cmake编译 cmake的作用就是将在IDE编译器中的编译功能拿出来,可以在终端上完成。类似于vim和文本编辑器。 cmake的编译方式: 内部构建(in-source-build)

weixin_44966641的博客 2329
上一篇: Kaczmarz方法
下一篇: python win环境 pip setuptools wheel安装
CoomCon
博客等级 码龄8年 1100粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoomCon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值