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。我们还指定了需要的组件,即 filesystemsystem。如果找到了 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 中用于查找和加载外部库或软件包。它按照特定的顺序在多个目录中搜索指定的软件包。这些搜索目录包括:

  1. CMake变量指定的路径
    • CMAKE_PREFIX_PATH:一个或多个路径的列表,CMake会在这些路径下查找软件包。
    • <PackageName>_DIR:对于特定软件包,可以设置一个变量来指定其配置文件的路径(例如,对于Foo包,设置Foo_DIR)。
  2. 系统默认路径
    • 在 Unix-like 系统上,通常包括 /usr/local/usr 等标准安装路径。
    • 在 Windows 系统上,可能包括一些特定于 Windows 的标准路径,如程序安装目录。
  3. 环境变量指定的路径
    • CMAKE_SYSTEM_PREFIX_PATH:系统环境变量指定的路径列表,例如在 Unix 系统上可能包括/usr/local/等。
    • 其他特定于系统的环境变量,如LD_LIBRARY_PATHPATH
  4. CMake模块路径
    • CMAKE_MODULE_PATH:这个变量可以用来指定自定义的“Find模块”的路径。通过将自定义模块路径添加到这个变量,可以让find_package使用这些自定义模块来查找软件包。
  5. 预定义的CMake模块
    • CMake还包含了一组预定义的模块,这些模块定义了常用软件包的查找逻辑。这些模块通常位于 CMake 安装目录的Modules子目录中。

find_package 首先尝试使用配置模式(即查找软件包提供的配置文件,如FooConfig.cmakefoo-config.cmake),如果失败,则回退到模块模式(使用 CMake 提供或自定义的 Find 模块,如FindFoo.cmake)。

正确设置这些路径可以确保 CMake 能够在预期的位置找到所需的软件包

CMAKE_PREFIX_PATH
_DIR
Unix-like系统
Windows系统
CMAKE_SYSTEM_PREFIX_PATH
LD_LIBRARY_PATH, PATH等
CMAKE_MODULE_PATH
开始find_package搜索
检查CMake变量
路径列表
特定软件包路径
系统默认路径
/usr/local, /usr等
特定于Windows的路径
环境变量指定路径
系统环境变量路径列表
其他系统环境变量
CMake模块路径
自定义Find模块路径
预定义CMake模块
CMake安装目录的Modules子目录

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

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

相关文章

【python_将列表整合成文本】

python_将列表整合成文本 # -*- coding: utf-8 -*-data [[指令卡主, 2023-12-25, 经贸有限公司, 孙悟空], [使用了屏幕保护之后&#xff0c;元素找不到了, 2023-12-25, 科技有限公司, 许三多], [操作用友的时候&#xff0c;找不到元素, 2024-01-02, 食品科技有限公司, 小张],…

python中装饰器的简单使用

文章目录 1 简介2 使用 1 简介 装饰器&#xff08;Decorator&#xff09;是 Python 中一种用于修改函数或类的行为的高级技术。装饰器本质上是一个函数&#xff0c;它接受一个函数作为输入&#xff0c;并返回一个新的函数作为输出。通过使用装饰器&#xff0c;可以在不修改原始…

BUG汇总

20240103 通用&#xff0c;驼峰命名法&#xff0c;mybatis。 mybatis入门程序中&#xff0c; // 获取对象的顺序为&#xff1a;SqlSessionFactoryBuild-》SqlSessionFactory-》SqlSessionSqlSessionFactoryBuilder sqlSessionFactoryBuilder new SqlSessionFactoryBuilder();I…

js中的事件传递

事件传递分为两个阶段&#xff0c;一是 事件捕获&#xff0c;二是 事件冒泡。分别对应下图1~5和6-10&#xff0c;每次触发的事件从window开始向下传播&#xff0c;一直到叶子节点&#xff0c;再往回传播。每个节点都允许添加监听器&#xff0c;浏览器在事件传播过程中一旦遇到监…

深入了解Go语言中的unsafe.Sizeof():探究变量与数据类型的内存占用

当涉及到在 Go 语言中确定变量或数据类型所占用的内存空间大小时&#xff0c;unsafe 包中的 Sizeof() 函数成为了一个强有力的工具。它可以用来获取变量或数据类型所占用的字节数&#xff0c;但需要注意的是&#xff0c;它不考虑内存对齐和填充的情况。因此&#xff0c;在使用 …

k8s三种常用的项目发布方式

k8s三种常用的项目发布方式 1、 蓝绿发布 2、 金丝雀发布(灰度发布)&#xff1a;使用最多 3 、滚动发布 应用程序升级&#xff0c;面临的最大问题是新旧业务之间的切换。 项目的生命周期&#xff1a;立项----定稿----需求发布----开发----测试-----发布 最后测试之后上线。再…

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(4)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置&#xff08;3&#xff09; 2.1 存储器域与PCI总线域 2.1.3 处理器域内容较多&#xff0c;为了便于理解&#xff0c;余下内容放到本回。 2.1.3 处理器域 在一个处理器系统中&am…

【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 概述

1、 Hadoop 是什么 &#xff08;1&#xff09;Hadoop是一个由Apache基金会所开发的分布式系统基础架构 &#xff08;2&#xff09;主要解决海量数据的存储和海量数据的分析计算问题 &#xff08;3&#xff09;广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念——Hadoop生…

Ef Core花里胡哨系列(10) 动态起来的 DbContext

Ef Core花里胡哨系列(10) 动态起来的 DbContext 我们知道&#xff0c;DbContext有两种托管方式&#xff0c;一种是AddDbContext和AddDbContextFactory&#xff0c;但是呢他们各有优劣&#xff0c;例如工厂模式下性能更好呀等等。那么&#xff0c;我们能否自己托管DbContext呢&…

keras人工智能框架 MNIST 数据集 随机展示

阅读本文之前&#xff0c;请先参考--------win10搭建keras深度学习框架 安装运行环境 使用Python绘图库Matplotlib随机输出mnist数据集的几个图片&#xff1a;代码见下图&#xff1a; 在sublimeText中 使用ctrlB运行代码&#xff0c;结果如下图&#xff1a;

c++ / day06

1. 利用模板类完成顺序表(两天时间&#xff0c;今天至少写出大致框架) 代码 //implement template in sqlist #include <iostream> #include <cstring>#define MAXSIZE 100using namespace std;template <typename T> class Sqlist {unsigned int len 0;T…

GaussDB数据库使用COPY命令导数

目录 一、前言 二、GaussDB数据库使用COPY命令导数语法 1、语法COPY FROM 2、语法COPY TO 3、特别说明及参数示意 三、GaussDB数据库使用COPY命令导数示例 1、操作步骤 2、准备工作&#xff08;示例&#xff09; 3、把一个表的数据拷贝到一个文件&#xff08;示例&…

kbdnecnt.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复?

不少人都在问“kbdnecnt.DLL文件”是什么&#xff1f;为什么电脑总是报错提示说“kbdnecnt.DLL文件缺失&#xff0c;软件无法启动”&#xff1f; 首先&#xff0c;先来了解“kbdnecnt.DLL文件”是什么&#xff1f; kbdnecnt.DLL是Windows操作系统中的一个动态链接库文件&#…

Spark二、Spark技术栈之Spark Core

Spark Core spark核心&#xff1a;包括RDD、RDD算子、RDD的持久化/缓存、累加器和广播变量 学习链接&#xff1a;https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、 RDD 1.1 为什么要有RDD 在许多迭代式算法(比如机器学习、图算法等)和交互式数据挖掘中&#xff0c;…

STL——string详解

目录 &#x1f4a1;介绍 &#x1f4a1;string的基本操作 &#x1f4a1;string的构造函数 &#x1f4a1;string赋值操作 &#x1f4a1;string字符串拼接 &#x1f4a1;string的查找和替换 &#x1f4a1;string字符串比较 &#x1f4a1;string字符存取 &#x1f4a1;str…

alibabaCloud学习笔记01(小滴课堂)

微服务架构常见的核心组件 讲解业务微服务架构常见解决方案 讲解AlibabaCloud核心组件介绍 创建数据库。 建表&#xff1a; 添加数据&#xff1a; 再建个用户库&#xff1a; 建表&#xff1a; 插入数据&#xff1a; 创建订单库&#xff1a; 建表&#xff1a; 创建项目&#x…

大数据时代的WEB运维高级架构师,Web系统运维工程师的实战成长之路

一、教程描述 本套WEB架构师教程&#xff0c;大小30.61G&#xff0c;共有183个文件。 二、教程目录 01-Web架构之单机时代&#xff08;共7课时&#xff09; 02-Web架构之集群时代&#xff08;共9课时&#xff09; 03-Web架构之DNS&#xff08;共6课时&#xff09; 04-Web…

常见的共轭先验分布

经常会遇到后验分布不能求解的问题&#xff0c;对于这个问题可以应用共轭先验分布解决&#xff0c;这些先验分布具有比较好的特征&#xff0c;能够使得出的后验分布和先验分布具有相同的分布族。如果一个具有参数属于分布的先验分布&#xff0c;则生成的后验分布也属于相同的分…

在 IBM Cloud 上使用 Spectrum LSF 管理数据

在 IBM Cloud 上使用 Spectrum LSF 管理数据 在云环境中处理 HPC 工作负载时&#xff0c;要解决的一个关键挑战是如何以最佳方式管理运行工作负载所需的数据&#xff0c;以及可能需要分析以进行进一步处理和决策的输出。 通过使用部署在 IBM Cloud上的 IBM Spectrum LSF 集群&…

【InnoDB数据存储结构】第2章节:InnoDB行格式

目录结构 之前整篇文章太长&#xff0c;阅读体验不好&#xff0c;将其拆分为几个子篇章。 本篇章讲解 InnoDB 行格式。 InnoDB 行格式 InnoDB 一行记录是如何存储的&#xff1f; 这个问题是本文的重点&#xff0c;也是面试中经常问到的问题&#xff0c;所以就引出了下文的 …