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

2024-08-26 04:04

本文主要是介绍在 CMake 中,find_package 是一个用于查找外部库或包的命令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 CMake 中,find_package 是一个用于查找外部库或包的命令。它使得你的 CMake 构建系统可以依赖于其他库或工具,并自动设置相关的编译和链接参数。find_package 是配置现代 CMake 项目的关键部分,特别是当你希望你的项目能够使用或依赖于第三方库时。

1. 基本语法

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

2. 参数说明

  • <PackageName>: 你要查找的包的名称。例如,BoostOpenCVQt5 等。
  • [version]: 指定包的最低版本。如果不指定,则接受任意版本。
  • REQUIRED: 表示此包是必需的。如果找不到该包,CMake 将终止并报告错误。
  • COMPONENTS: 列出你希望从该包中使用的特定组件。例如,在查找 Qt5 时,你可以指定使用 CoreWidgets 组件。
  • OPTIONAL_COMPONENTS: 列出你希望查找但不是必需的组件。如果这些组件不可用,CMake 不会报错。
  • EXACT: 要求版本号必须完全匹配。
  • QUIET: 在找不到包时,抑制警告消息,但仍然会失败。
  • NO_MODULE: 强制 CMake 仅使用 Config 模式查找包,而不是 Module 模式。
  • MODULE: 强制 CMake 仅使用 Module 模式查找包。

3. find_package 的两种模式

  • Module 模式: CMake 在 CMAKE_MODULE_PATH 中查找名为 Find<PackageName>.cmake 的模块文件。如果找到了这个文件,CMake 就会执行该文件,通常这个文件会设置与库相关的变量(如 PackageName_INCLUDE_DIRSPackageName_LIBRARIES)。

    示例:

    find_package(Boost REQUIRED COMPONENTS system filesystem)
    
  • Config 模式: CMake 查找 <PackageName>Config.cmake<lowercasename>-config.cmake 文件。这种文件通常由包的安装过程生成,并包含包的所有信息。Config 模式是推荐的模式,特别是在使用现代 CMake 时。

    示例:

    find_package(Qt5 REQUIRED COMPONENTS Core Widgets)
    

4. 查找结果

在调用 find_package 之后,通常会设置一组与包相关的变量,你可以在之后的 CMake 脚本中使用这些变量。例如:

  • <PackageName>_FOUND:如果找到了包,则该变量为 TRUE,否则为 FALSE
  • <PackageName>_INCLUDE_DIRS:包含该包的头文件目录。
  • <PackageName>_LIBRARIES:链接该包所需的库列表。
  • <PackageName>_VERSION:找到的包的版本。

5. 示例

5.1 查找 Boost 库
find_package(Boost 1.70 REQUIRED COMPONENTS system filesystem)
if(Boost_FOUND)include_directories(${Boost_INCLUDE_DIRS})target_link_libraries(myTarget ${Boost_LIBRARIES})
endif()
5.2 查找 Qt5 库
find_package(Qt5 5.15 REQUIRED COMPONENTS Core Widgets)
if(Qt5_FOUND)target_link_libraries(myTarget Qt5::Core Qt5::Widgets)
endif()

6. 自定义 find_package 的模块路径

有时,你可能需要为特定的包编写自定义的 Find<PackageName>.cmake 模块。可以使用 CMAKE_MODULE_PATH 变量来指定自定义模块路径:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
find_package(MyCustomPackage REQUIRED)

总结

find_package 是 CMake 中非常重要的命令,用于管理项目对外部库和包的依赖。理解它的用法和工作原理,对于编写健壮、可移植的 CMake 脚本至关重要。

这篇关于在 CMake 中,find_package 是一个用于查找外部库或包的命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107493

相关文章

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间

使用mvn deploy命令上传jar包的实现

《使用mvndeploy命令上传jar包的实现》本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学... 目录一、背景二、环境三、配置nexus上传账号四、执行deploy命令上传包1. 首先需要把本地仓中要

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Windows命令之tasklist命令用法详解(Windows查看进程)

《Windows命令之tasklist命令用法详解(Windows查看进程)》tasklist命令显示本地计算机或远程计算机上当前正在运行的进程列表,命令结合筛选器一起使用,可以按照我们的需求进行过滤... 目录命令帮助1、基本使用2、执行原理2.1、tasklist命令无法使用3、筛选器3.1、根据PID

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

linux打包解压命令方式

《linux打包解压命令方式》文章介绍了Linux系统中常用的打包和解压命令,包括tar和zip,使用tar命令可以创建和解压tar格式的归档文件,使用zip命令可以创建和解压zip格式的压缩文件,每... 目录Lijavascriptnux 打包和解压命令打包命令解压命令总结linux 打包和解压命令打

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li