CMake中FindPackageHandleStandardArgs.cmake文件的作用和用法

这篇具有很好参考价值的文章主要介绍了CMake中FindPackageHandleStandardArgs.cmake文件的作用和用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

FindPackageHandleStandardArgs.cmake 是 CMake 内置的一个模块,它用于定义一个宏,可以用于在找到一个包之后,对其进行一些标准化的处理,它通常用于在CMake中查找和配置外部库或工具包。
find_package_handle_standard_args并不会去特定的路径查找文件,它只是一个CMake宏,用于在CMake中处理和验证找到的包。
实际上,find_package_handle_standard_args通常是在find_package命令中调用的。find_package命令会去指定的路径查找包的配置文件,在找到文件后,它会调用find_package_handle_standard_args来处理和验证找到的包。
在CMake中,每个包都有一个配置文件,用于描述包的信息和依赖项。这些配置文件通常位于预定义的路径下,例如CMAKE_MODULE_PATH或CMAKE_PREFIX_PATH,也可以在find_package命令中通过指定PATHS参数来指定包的路径。
当find_package命令找到包的配置文件时,它会将配置文件中定义的变量和选项导入到CMake中,并调用find_package_handle_standard_args来处理和验证找到的包。因此,find_package_handle_standard_args并不是用来查找包的工具,它只是用来处理和验证找到的包的工具。


FindPackageHandleStandardArgs命令

该命令处理Find_Package()的必需参数、安静参数和与版本相关的参数。它还设置_FOUND变量。如果列出的所有变量都包含有效结果,例如有效的文件路径,则认为找到了该程序包。


命令原型

find_package_handle_standard_args(<PackageName>
 (DEFAULT_MSG|<custom-failure-message>)
 <required-var>...
)

find_package_handle_standard_args(<PackageName>
 [FOUND_VAR <result-var>]
 [REQUIRED_VARS <required-var>...]
 [VERSION_VAR <version-var>]
 [HANDLE_VERSION_RANGE]
 [HANDLE_COMPONENTS]
 [CONFIG_MODE]
 [NAME_MISMATCHED]
 [REASON_FAILURE_MESSAGE <reason-failure-message>]
 [FAIL_MESSAGE <custom-failure-message>]
 )
  • options

(DEFAULT_MSG|<custom-failure-message>)
In the simple signature this specifies the failure message. Use DEFAULT_MSG to ask for a default message to be computed (recommended). Not valid in the full signature.

FOUND_VAR <result-var>
Deprecated since version 3.3.

Specifies either <PackageName>_FOUND or <PACKAGENAME>_FOUND as the result variable. This exists only for compatibility with older versions of CMake and is now ignored. Result variables of both names are always set for compatibility.

REQUIRED_VARS <required-var>...
Specify the variables which are required for this package. These may be named in the generated failure message asking the user to set the missing variable values. Therefore these should typically be cache entries such as FOO_LIBRARY and not output variables like FOO_LIBRARIES.

Changed in version 3.18: If HANDLE_COMPONENTS is specified, this option can be omitted.

VERSION_VAR <version-var>
Specify the name of a variable that holds the version of the package that has been found. This version will be checked against the (potentially) specified required version given to the find_package() call, including its EXACT option. The default messages include information about the required version and the version which has been actually found, both if the version is ok or not.

HANDLE_VERSION_RANGE
New in version 3.19.

Enable handling of a version range, if one is specified. Without this option, a developer warning will be displayed if a version range is specified.

HANDLE_COMPONENTS
Enable handling of package components. In this case, the command will report which components have been found and which are missing, and the <PackageName>_FOUND variable will be set to FALSE if any of the required components (i.e. not the ones listed after the OPTIONAL_COMPONENTS option of find_package()) are missing.

CONFIG_MODE
Specify that the calling find module is a wrapper around a call to find_package(<PackageName> NO_MODULE). This implies a VERSION_VAR value of <PackageName>_VERSION. The command will automatically check whether the package configuration file was found.

REASON_FAILURE_MESSAGE <reason-failure-message>
New in version 3.16.

Specify a custom message of the reason for the failure which will be appended to the default generated message.

FAIL_MESSAGE <custom-failure-message>
Specify a custom failure message instead of using the default generated message. Not recommended.

NAME_MISMATCHED
New in version 3.17.

Indicate that the <PackageName> does not match ${CMAKE_FIND_PACKAGE_NAME}. This is usually a mistake and raises a warning, but it may be intentional for usage of the command for components of a larger package.

用法和示例

使用FindPackageHandleStandardArgs.cmake时,需要提供以下参数:
PACKAGE_NAME:要查找的包的名称。
DEFAULT_MSG:如果找不到包时要显示的默认消息。
CONDITION:一个布尔表达式,用于确定是否找到了包。如果条件为真,则FindPackageHandleStandardArgs.cmake将返回TRUE
REQUIRED_VARS:一个包含所需变量的列表。如果这些变量未定义,则FindPackageHandleStandardArgs.cmake将返回FALSE


**它通常在编写自己的xxx.cmake会被用到 ,至于怎么编写,可以查看我的这篇博客:编写属于自己的Findxxx.cmake文件


下面是FindPackageHandleStandardArgs.cmake的示例用法:
find_package_handle_standard_args(MyPackage REQUIRED_VARS MY_PACKAGE_INCLUDE_DIRS MY_PACKAGE_LIBRARIES)
在这个例子中,我们要查找名为MyPackage的包,并验证MY_PACKAGE_INCLUDE_DIRS和MY_PACKAGE_LIBRARIES这两个变量是否定义。

  • 如果这两个变量未定义,则FindPackageHandleStandardArgs.cmake将返回FALSE。
  • 如果找到了包并且所有必需的变量都已定义,则FindPackageHandleStandardArgs.cmake将返回TRUE,并将输出一个消息,指示已找到包。
  • 如果找不到包,则FindPackageHandleStandardArgs.cmake将显示DEFAULT_MSG中指定的默认消息,并返回FALSE。

在CMake中使用FindPackageHandleStandardArgs.cmake可以帮助简化外部库或工具包的配置过程,减少手动编写配置脚本的工作量。


FindPackageHandleStandardArgs搜索路径

FindPackageHandleStandardArgs宏本身不会搜索路径,它只是用于处理标准的查找参数并输出查找失败消息和查找提示。路径搜索是由find_package命令完成的,该命令在调用FindPackageHandleStandardArgs宏之前会搜索一系列指定的路径。


find_package()命令首先会在模块路径中寻找一个事先编译好的Find.cmake文件,而且一般官方给出了很多,不需要自己编写这是查找库的一个典型方式。 如果Module模式搜索失败,没有找到对应的Find.cmake文件,则转入Config模式进行。


在find_package命令中的路径搜索顺序

  1. 检查是否定义了指定库的导入目录变量,例如<package>_DIR
  2. 检查环境变量,例如<package>_ROOT
  3. 搜索系统路径,例如/usr/include和/usr/lib
  4. 搜索用户指定的路径,例如CMAKE_PREFIX_PATHCMAKE_MODULE_PATH

当找到指定库的头文件和库文件时,find_package会定义一系列变量来描述找到的库,例如_FOUND、_INCLUDE_DIRS和_LIBRARIES。然后,FindPackageHandleStandardArgs宏将使用这些变量来判断查找是否成功,并输出查找提示(如果有)。


运用场景

在 CMake 中,通常使用 find_package 命令来查找并加载所需的外部依赖库,该命令通常会在系统上查找特定的文件或库,或者在预定义的路径中查找这些文件或库。一旦找到了库,那么通常需要对其进行一些配置,比如设置头文件路径、库文件路径、编译选项等。
这时候就可以使用 FindPackageHandleStandardArgs.cmake 宏来进行标准化处理。该宏的作用是:根据找到的库的信息,判断库是否存在、是否可用、是否满足要求,如果符合要求,就将该库的相关信息(包括头文件路径、库文件路径等)传递给 find_package 命令调用方,并设置变量 _FOUND。如果库不符合要求,则给出错误提示。
使用 FindPackageHandleStandardArgs.cmake 的好处在于它可以避免在不同系统、不同版本的库中进行不必要的配置,并能够将配置信息统一化,减少重复代码。同时,使用该宏可以使得查找和配置外部库更加可靠和可移植。


在CMake中,find_package命令的使用方式有多种,其中一种常见的方式是使用预定义的Find模块,例如FindBoost.cmake、FindOpenCV.cmake等。这些Find模块通常已经包含了适当的逻辑来查找并验证库,并在找到库后设置相关的变量和宏。
在这种情况下,find_package命令会直接调用相应的Find模块来查找库,而不会调用FindPackageHandleStandardArgs命令。
然而,对于某些库,可能没有预定义的Find模块可用,或者需要自定义查找逻辑。在这种情况下,用户可以编写自己的Find模块,并在其中调用FindPackageHandleStandardArgs命令来验证库的可用性。
文章来源地址https://www.toymoban.com/news/detail-705704.html


到了这里,关于CMake中FindPackageHandleStandardArgs.cmake文件的作用和用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【CMake】第2篇 CMake构建.h与.cpp文件

    目录 1、文件目录结构 add.h  add.cpp main.cpp CMakeLists.txt 2、CMake构建项目 3、构建工程优化 使用 aux_source_directory(./src SRC_LIST)  4、优化目录,生成可执行文件到bin下 首先来看一下目前的目录结构: add.h  add.cpp main.cpp CMakeLists.txt  cmake_minimum_required(VERSION 2.8) 指定cmake的最小版本。

    2023年04月08日
    浏览(32)
  • cpp文件编译过程 makefile cmake

    直接 gcc 没有-o 的话出来的输出exe文件没有调试信息,相比-o的大小会小一点,只有包含了调试信息文件才可以执行 头文件在编译器的include目录中,编译时 -I 指定库 函数库默认路径在编译器的lib目录中,编译时 -L指定目录,-l 小写L 指定库 函数或者是在别的c与cpp文件中 静态

    2024年02月08日
    浏览(37)
  • CMake获取目录下所有源文件

    1、aux_source_directory指令         aux_source_directory( dir variable ) 比如:         aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} ALL_SOURCE) , 这样将当前目录所有的源文件(.cpp 和.c文件)都放到了ALL_SOURCE变量中,但是头文件并没有被包括进去,若在头文件有函数的实现部分,采用这

    2024年02月15日
    浏览(46)
  • CMake不生成QT的UI头文件

    QT版本5.14.2:: MSVC_2017_64 编译器VS2019 因为学习QT开发的时候要查看x.ui文件转换成ui_x.h头文件的内容,但是编译器编译的时候没有生成ui_x.h头文件。查看代码发现: 已经引用到了该文件了。可能是编译过程中,生成了,使用了,然后又删掉了。 学习过程,想看到里面的内容 打开

    2024年02月12日
    浏览(43)
  • AndroidNDK开发——使用Cmake编译生成so文件

    最近做串口开发需要编译不同的so文件,于是查找了各种资料,学习了一下so编译. 直接跑项目或者使用gradle构建so生成的so文件如下:这里大家根据自己的需求配置生成so文件,本文只是举例没有全部生成. 如果不引入so文件初始化和调用时会报错,提示找不到so文件,一定要记

    2024年02月15日
    浏览(42)
  • qt中cmake自动处理ui文件的前提

    参考了下面的网址 http://cn.voidcc.com/question/p-wpcanvtj-tn.html http://cn.voidcc.com/question/p-wpcanvtj-tn.html [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GUDEGbZx-1691477530154)(/api/file/getImage?fileId=64d1e2ce2a7f2605f9000610)]

    2024年02月04日
    浏览(37)
  • 现代CMake高级教程 - 第 3 章:链接库文件

    双笙子佯谬老师的【公开课】现代CMake高级教程课程笔记 main.cpp 调用 mylib.cpp 里的 say_hello 函数 1. 直接链接到一起编译 2. mylib 作为一个静态库 编译: 生成了 libmylib.a: 3. mylib 作为一个动态库 编译: 4. mylib 作为一个对象库 对象库类似于静态库,但不生成 .a 文件,只由 CMake

    2024年02月02日
    浏览(41)
  • 通过 CMake 制作库文件 静态库 和 动态库

    CMake Calc 项目 在这里有 add.c,div.c,mult.c,sub.c,main.c,head.h 二、生成静态库  CMakeLists.txt  CMakeLists.txt   (也可以写成这样) 执行命令:  三、生成动态库 CMakeLists.txt    CMakeLists.txt   (也可以写成这样) 

    2024年01月16日
    浏览(50)
  • vscode Cmake 多目录,多文件夹,多文件联合编译配置

    前言:网上好多同学发的都是单目录(一个文件夹下),多个cpp文件的联合编译。对于多文件夹,多目录,多个CPP文件的编译可查询的资料查起来不是很容易。 现在来总结一下: 一、单文件夹(即单目录)下的多.cpp使用code runner 运行代码的方式。               其他博文有

    2024年01月15日
    浏览(48)
  • (不用手动下文件)opencv用CMake编译下载失败解决

    报错信息: 解决思路: 更改cmake文件,使用GitHub Proxy 代理加速 (ghproxy.com)对网址进行转发。、 解决步骤: ① 打开opencv-4.7.0cmakeOpenCVDownload.cmake,在157行下方增加两行: (opencv-4.7.0为 源码文件夹 ,不同版本的名称会不一样,如opencv-4.6.0等等) ② 修改完如下图所示(修改完

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包