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子目录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据库原理】(7)关系数据库的完整性约束

关系模型的完整性规则是为了确保数据的唯一性和数据之间的关系的准确性。 有三类完整性约束:实体完整性、参照完整性和用户定义完整性。 其中实体完整性和参照完整性是必须满足的完整性约束条件,应该由关系系统自动支持。 实体完整性 实体完整性的核心概念 唯一性&#xf…

【目标检测实验系列】YOLOv5模型改进:融合混合注意力机制CBAM,关注通道和空间特征,助力模型高效涨点!(内含源代码,超详细改进代码流程)

自我介绍&#xff1a;本人硕士期间全程放养&#xff0c;目前成果:一篇北大核心CSCD录用,两篇中科院三区已见刊&#xff0c;一篇中科院四区在投。如何找创新点&#xff0c;如何放养过程厚积薄发&#xff0c;如何写中英论文&#xff0c;找期刊等等。本人后续会以自己实战经验详细…

ElasticSearch自定义算分排序(Function Score Query)

使用 function score query&#xff0c;可以修改文档的相关性算分 (query score)&#xff0c;根据新得到的算分排序。 目录 Function Score Query 案例 Function Score Query 几种默认的计算分值的函数&#xff1a; Weight:为每一个文档设置一个简单而不被规范化的权重Fie…

商业综合体能源管理系统功能有哪些?能够为企业带来哪些价值?

随着IT行业的迅猛发展&#xff0c;仅仅实现智能控制已无法满足当前绿色低碳发展的要求&#xff0c;随着智能设备的增多&#xff0c;同时也产生了越来越多的信息孤岛。通过信息技术构建能源管理系统&#xff0c;可以实现先进、智能、经济、可行的商业综合体能源管理解决方案。 …

木工开料机怎么做到减少加工误差的?

在板式家具生产加工中使用木工开料机加工&#xff0c;不仅仅可以提升板材的加工精度&#xff0c;还可以减少板材加工误差&#xff0c;减少板材浪费&#xff0c;所以整个开料环节非常的重要&#xff0c;所以在选择设备的时候一定要谨慎&#xff0c;选择质量可靠的设备。 木工开料…

ssm基于web的网络游戏交易平台信息管理系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装网络游戏交易平台软件来发挥其高效地信息处理的作用&#x…

HTML5+CSS3+Vue小实例:彩色圆环溶解加载动画

实例:彩色圆环溶解加载动画 技术栈:HTML+CSS+Vue.js 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge&…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Column组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之线性布局容器Column组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Column组件 沿垂直方向布局的容器。 子组件 可以包含子组件。 接…

力扣hot100 二叉树的右视图 递归

&#x1f468;‍&#x1f3eb; 题目地址 时间复杂度&#xff1a; O ( n ) O(n) O(n) &#x1f60b; AC code /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(…

计算机毕业设计------SSM邮件收发管理系统

项目介绍 本项目为基于SSM的邮件收发管理系统&#xff1b; 用户角色包含以下功能&#xff1a; 用户登录,写信给好友,查看收件箱,查看已发送的邮件,草稿箱查看,通讯录设置,个人资料管理等功能。 环境需要 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平…

Golang-strconv库学习笔记

前言&#xff1a; strconv库是go官方提供的一个标准包&#xff0c;主要用于字符串相关的处理。通过参考官方文档、中文文档和其他工具&#xff0c;进行学习记录。学习重点是其中的内置方法。 本文分为Atoi&#xff0c;Format系列&#xff0c;Parse系列&#xff0c;Append系列,…

SparkSQL基础解析(三)

1、 Spark SQL概述 1.1什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块&#xff0c;它提供了2个编程抽象&#xff1a;DataFrame和 DataSet&#xff0c;并且作为分布式SQL查询引擎的作用。 我们已经学习了Hive&#xff0c;它是将Hive SQL转换成MapReduce然后提…

众和策略安全可靠:如何区分大盘股和小盘股?大盘股指数有哪些?

股票根据流转盘能够划分为大盘股、中盘股、小盘股这三大类&#xff0c;那么&#xff0c;怎么区别大盘股和小盘股&#xff1f;大盘股指数有哪些&#xff1f;下面众和策略为我们准备了相关内容&#xff0c;以供参考。 怎么区别大盘股和小盘股&#xff1f; 根据个股的市值来区别…

希亦、觉飞、小吉三款婴儿洗衣机大比拼!全方位对比测评

由于年龄幼小的婴儿的皮肤都非常的幼嫩&#xff0c;因此婴儿衣物材质的类型大部分都是采用为纯棉&#xff0c;并且婴儿的衣物不能够与大人的衣物一起进行混洗&#xff0c;容易把细菌感染到宝宝的衣物上&#xff0c;因此很多家庭为了保证宝宝衣服的有效清洁&#xff0c;避免交叉…

自动化测试用例设计粒度

自动化测试用例的粒度指的是测试用例的细致程度&#xff0c;即每个测试用例检查的功能点的数量和范围。 通常&#xff0c;根据测试用例的粒度&#xff0c;可以被分为3种不同的层次&#xff0c;从更低层次的细粒度到更高层次的粗粒度。 第一种&#xff1a;单元测试 - 细粒度 …

使用IDEA创建使用 JDK8 的 2.x.x 版本的 Spring Boot 项目以及 Spring Boot 项目如何修改JDK版本

目录 一、在阿里云上官网上创建项目 二、将 IDEA 中创建项目的源地址修改为阿里云官网 三、创建 3.x.x 的项目之后修改配置降低至 2.7.x 版本和使用 JDK8&#xff08;修改 Spring Boot 的 JDK 版本同理&#xff09; 从上面的 Spring Boot 官网的截图中可以发现&#xff0c;自…

【算法挨揍日记】day34——647. 回文子串、5. 最长回文子串

647. 回文子串 647. 回文子串 题目描述&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&am…

1 电科院FTU检测标准学习笔记-外观检查

作者简介&#xff1a; 本人从事电力系统多年&#xff0c;岗位包含研发&#xff0c;测试&#xff0c;工程等&#xff0c;具有丰富的经验 在配电自动化验收测试以及电科院测试中&#xff0c;本人全程参与&#xff0c;积累了不少现场的经验 目录 **前言****检测大纲****外观与结构…

docker (portainer 安装nginx)

一、创建容器 二、配置端口&#xff0c;以及容器卷挂载 挂载目录配置&#xff1a;(下方截图的目录如下&#xff0c;docker 改为 mydocker&#xff0c;用docker作为根目录不行) /mydocker/nginx/html /usr/share/nginx/html /mydocker/nginx/conf/nginx.conf /etc/nginx/ng…

18|CAMEL:通过角色扮演脑暴一个鲜花营销方案

18&#xff5c;CAMEL&#xff1a;通过角色扮演脑暴一个鲜花营销方案 CAMEL 交流式代理框架 下面我们一起来看看 CAMEL——这个多 AI 通过角色扮演进行交互的框架&#xff0c;以及它在 LangChain 中的具体实现。 CAMEL&#xff0c;字面意思是骆驼。这个框架来自于论文《CAMEL:…