cmake中的find_package()

使用依赖项指南提供了对此一般主题的高级介绍。 它提供了 find_package() 命令在更大范围内的应用范围的更广泛概述,包括它与 FetchContent 模块的关系。 建议先阅读该指南,然后再继续了解以下详细信息。
找到一个包(通常由项目外部的东西提供),并加载其特定于包的详细信息。 对此命令的调用也可以被依赖项提供程序拦截。

搜索模式

该命令有几种搜索包的模式:
模块模式
在此模式下,CMake 搜索名为 Find<PackageName>.cmake 的文件,首先在 CMAKE_MODULE_PATH 中列出的位置中查找,然后在 CMake 安装提供的查找模块中查找。 如果找到该文件,则由 CMake 读取并处理该文件。 它负责查找包、检查版本并生成任何所需的消息。 某些 Find 模块对版本控制提供有限支持或不提供支持; 检查查找模块的文档。
Find<PackageName>.cmake 文件通常不是由包本身提供的。 相反,它通常由包外部的某些东西提供,例如操作系统、CMake 本身,甚至是调用 find_package() 命令的项目。 由于是外部提供的,查找模块本质上往往是启发式的,并且很容易过时。 他们通常搜索某些库、文件和其他包工件。
模块模式仅受基本命令签名支持。
配置模式
在此模式下,CMake 搜索名为 <lowercasePackageName>-config.cmake 或 <PackageName>Config.cmake 的文件。 如果指定了版本详细信息,它还会查找 <lowercasePackageName>-config-version.cmake 或 <PackageName>ConfigVersion.cmake(有关如何使用这些单独版本文件的说明,请参阅配置模式版本选择)。
在配置模式下,可以为该命令提供一个名称列表以作为包名称进行搜索。 CMake 搜索配置和版本文件的位置比模块模式复杂得多(请参阅配置模式搜索过程)。
配置和版本文件通常作为包的一部分安装,因此它们往往比查找模块更可靠。 它们通常包含包内容的直接信息,因此在配置或版本文件本身中不需要搜索或启发式。
基本命令签名和完整命令签名都支持配置模式。
FetchContent重定向模式
版本 3.24 中的新增功能:对 find_package() 的调用可以在内部重定向到 FetchContent 模块提供的包。 对于调用者来说,行为将类似于 Config 模式,只不过绕过了搜索逻辑并且不使用组件信息。 有关更多详细信息,请参阅 FetchContent_Declare() 和 FetchContent_MakeAvailable()。
当不重定向到 FetchContent 提供的包时,命令参数确定是否使用 Module 或 Config 模式。 当使用基本签名时,该命令首先以Module 模式进行搜索。 如果未找到该包,搜索将退回到配置模式。 用户可以将 CMAKE_FIND_PACKAGE_PREFER_CONFIG 变量设置为 true 以反转优先级,并指示 CMake 首先使用配置模式进行搜索,然后再返回到模块模式。 还可以通过 MODULE 关键字强制基本签名仅使用模块模式。 如果使用完整签名,则该命令仅在Config模式下进行搜索。
在可能的情况下,用户代码通常应该使用基本签名来查找包,因为这允许使用任何模式找到包。 希望提供配置包的项目维护者应该了解更大的情况,如完整签名和本页所有后续部分中所述。

基础签名

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [REGISTRY_VIEW  (64|32|64_32|32_64|HOST|TARGET|BOTH)]
             [GLOBAL]
             [NO_POLICY_SCOPE]
             [BYPASS_PROVIDER])

Module 和 Config 模式都支持基本签名。 MODULE 关键字意味着只能使用模块模式来查找包,而不能回退到配置模式。
无论使用哪种模式,都会设置 <PackageName>_FOUND 变量来指示是否找到包。 当找到包时,可以通过包本身记录的其他变量和导入目标来提供特定于包的信息。 QUIET 选项禁用信息性消息,包括那些指示如果不需要则无法找到包的消息。 如果找不到包,REQUIRED 选项将停止处理并显示错误消息。
所需组件的特定于包的列表可能会列在 COMPONENTS 关键字之后。 如果这些组件中的任何一个不能满足,则整个包被视为未找到。 如果 REQUIRED 选项也存在,则这被视为致命错误,否则执行仍继续。 作为一种简写形式,如果存在 REQUIRED 选项,则可以省略 COMPONENTS 关键字,并且可以在 REQUIRED 之后直接列出所需的组件。
其他可选组件可能会列在 OPTIONAL_COMPONENTS 之后。 如果不能满足这些要求,只要满足所有必需的组件,仍然可以认为找到了整个包。
可用组件集及其含义由目标包定义。 形式上,目标包如何解释给定的组件信息取决于目标包,但它应该遵循上述期望。 对于未指定组件的调用,没有单一的预期行为,目标包应明确定义在这种情况下会发生什么。 常见的安排包括假设它应该找到所有组件、没有组件或可用组件的某个明确定义的子集。
版本 3.24 中的新增功能:REGISTRY_VIEW 关键字指定应查询哪些注册表视图。 该关键字仅在 Windows 平台上有意义,在所有其他平台上将被忽略。 形式上,由目标包决定如何解释提供给它的注册表视图信息。
版本 3.24 中的新增功能:指定 GLOBAL 关键字会将所有导入的目标提升到导入项目中的全局范围。 或者,可以通过设置 CMAKE_FIND_PACKAGE_TARGETS_GLOBAL 变量来启用此功能。
[version] 参数请求找到的包应该兼容的版本。 有两种可能的形式可以指定:

  • 格式为 Major[.minor[.patch[.tweak]]] 的单一版本,其中每个组件都是一个数值。
  • 版本范围的格式为 versionMin…[<]versionMax,其中 versionMin 和 versionMax 与单个版本具有相同的格式和对整数的组件的约束。 默认情况下,包括两个端点。 通过指定<,将排除上端点。 仅 CMake 3.19 或更高版本支持版本范围。

EXACT 选项要求版本完全匹配。 该选项与版本范围的规范不兼容。
如果没有为 find-module 内的递归调用提供 [version] 和/或组件列表,则相应的参数将从外部调用自动转发(包括 [version] 的 EXACT 标志)。 当前仅按包提供版本支持(请参阅下面的版本选择部分)。 当指定版本范围但包仅设计为期望单个版本时,包将忽略范围的上端点,而仅考虑范围下端点的单个版本。
有关 NO_POLICY_SCOPE 选项的讨论,请参阅 cmake_policy() 命令文档。
版本 3.24 中的新增功能:仅当依赖项提供程序调用 find_package() 时才允许使用 BYPASS_PROVIDER 关键字。 提供程序可以使用它直接调用内置的 find_package() 实现,并防止该调用被重新路由回自身。 CMake 的未来版本可能会检测到从依赖项提供程序以外的地方使用此关键字的尝试,并因致命错误而停止。

全部签名

find_package(<PackageName> [version] [EXACT] [QUIET]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [CONFIG|NO_MODULE]
             [GLOBAL]
             [NO_POLICY_SCOPE]
             [BYPASS_PROVIDER]
             [NAMES name1 [name2 ...]]
             [CONFIGS config1 [config2 ...]]
             [HINTS path1 [path2 ... ]]
             [PATHS path1 [path2 ... ]]
             [REGISTRY_VIEW  (64|32|64_32|32_64|HOST|TARGET|BOTH)]
             [PATH_SUFFIXES suffix1 [suffix2 ...]]
             [NO_DEFAULT_PATH]
             [NO_PACKAGE_ROOT_PATH]
             [NO_CMAKE_PATH]
             [NO_CMAKE_ENVIRONMENT_PATH]
             [NO_SYSTEM_ENVIRONMENT_PATH]
             [NO_CMAKE_PACKAGE_REGISTRY]
             [NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.
             [NO_CMAKE_SYSTEM_PATH]
             [NO_CMAKE_INSTALL_PREFIX]
             [NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
             [CMAKE_FIND_ROOT_PATH_BOTH |
              ONLY_CMAKE_FIND_ROOT_PATH |
              NO_CMAKE_FIND_ROOT_PATH])

CONFIG 选项、同义的 NO_MODULE 选项或使用基本签名中未指定的选项都强制执行纯 Config 模式。 在纯配置模式下,该命令会跳过模块模式搜索并立即继续进行配置模式搜索。
配置模式搜索尝试查找要查找的包提供的配置文件。 创建名为\ _DIR 的缓存条目来保存包含该文件的目录。 默认情况下,该命令搜索名为\ 的包。 如果给出了 NAMES 选项,则使用其后面的名称而不是\ 。 在确定是否将调用重定向到 FetchContent 提供的包时,还会考虑这些名称。
该命令为每个指定的名称搜索名为\ Config.cmake 或\ -config.cmake 的文件。 可以使用 CONFIGS 选项给出可能的配置文件名的替换集。 配置模式搜索过程指定如下。 一旦找到,就会检查任何版本约束,如果满足,则 CMake 读取并处理配置文件。 由于该文件是由包提供的,因此它已经知道包内容的位置。 配置文件的完整路径存储在 cmake 变量 <PackageName>_CONFIG 中。
CMake 在搜索具有适当版本的包时考虑的所有配置文件都存储在 <PackageName>_CONSIDERED_CONFIGS 变量中,并且关联的版本存储在\ _CONSIDERED_VERSIONS 变量中。
如果找不到包配置文件,除非指定了 QUIET 参数,否则 CMake 将生成描述问题的错误。 如果指定了 REQUIRED 并且未找到包,则会生成致命错误,并且配置步骤将停止执行。 如果\ _DIR 已设置为不包含配置文件的目录,CMake 将忽略它并从头开始搜索。
鼓励提供 CMake 包配置文件的包维护者命名并安装它们,以便下面概述的配置模式搜索过程无需使用其他选项即可找到它们。

配置模式搜索过程

当使用配置模式时,无论给出的是完整签名还是基本签名,都会应用此搜索过程。
版本 3.24 中的新增功能:所有对 find_package() 的调用(即使在模块模式下)都会首先在 CMAKE_FIND_PACKAGE_REDIRECTS_DIR 目录中查找配置包文件。 FetchContent 模块,甚至项目本身,都可以将文件写入该位置,以将 find_package() 调用重定向到项目已提供的内容。 如果在该位置没有找到配置包文件,则按照下面描述的逻辑继续搜索。
CMake 为包构造一组可能的安装前缀。 在每个前缀下,会在多个目录中搜索配置文件。 下表显示了搜索到的目录。 每个条目均适用于遵循 Windows (W)、UNIX (U) 或 Apple (A) 约定的安装树:

接口标识
<prefix>/W
<prefix>/(cmake|CMake)/W
<prefix>/<name>*/W
<prefix>/<name>*/(cmake|CMake)/W
<prefix>/<name>/(cmake|CMake)/<name>/ [1]W
<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/U
<prefix>/(lib/<arch>|lib*|share)/<name>*/U
<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/U
<prefix>//(lib/<arch>|lib|share)/cmake/<name>*/W/U
<prefix>//(lib/<arch>|lib|share)/<name>*/W/U
<prefix>//(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/W/U

3.25 版本中的新功能。
在支持 macOS FRAMEWORK 和 BUNDLE 的系统上,会在以下目录中搜索包含配置文件的框架或应用程序包:

接口标识
<prefix>/<name>.framework/Resources/A
<prefix>/<name>.framework/Resources/CMake/A
<prefix>/<name>.framework/Versions/*/Resources/A
<prefix>/<name>.framework/Versions/*/Resources/CMake/A
<prefix>/<name>.app/Contents/Resources/A
<prefix>/<name>.app/Contents/Resources/CMake/A

在所有情况下,<name> 均被视为不区分大小写,并对应于任何指定的名称( 或 NAMES 给出的名称)。
如果至少启用了一种编译语言,则可以根据编译器的目标体系结构按以下顺序搜索特定于体系结构的 lib/ 和 lib* 目录:
lib/<arch>
搜索是否设置了 CMAKE_LIBRARY_ARCHITECTURE 变量。
lib64
在 64 位平台上搜索(CMAKE_SIZEOF_VOID_P 为 8)并且 FIND_LIBRARY_USE_LIB64_PATHS 属性设置为 TRUE。
lib32
在 32 位平台上搜索(CMAKE_SIZEOF_VOID_P 为 4)并且 FIND_LIBRARY_USE_LIB32_PATHS 属性设置为 TRUE。
libx32
如果 FIND_LIBRARY_USE_LIBX32_PATHS 属性设置为 TRUE,则在使用 x32 ABI 的平台上进行搜索。
lib
一直搜索
版本 3.24 中的更改:在 Windows 平台上,可以使用专用语法将注册表查询包含为通过 HINTS 和 PATHS 关键字指定的目录的一部分。 在所有其他平台上,此类规范将被忽略。
版本 3.24 中的新增功能:可以指定 REGISTRY_VIEW 来管理指定为 PATHS 和 HINTS 一部分的 Windows 注册表查询。
指定必须查询哪些注册表视图。 该选项仅在 Windows 平台上有意义,在其他平台上将被忽略。 如果未指定,则当 CMP0134 策略为 NEW 时,将使用 TARGET 视图。 有关策略为 OLD 时的默认视图,请参阅 CMP0134。
64
询64位注册表。 在 32 位 Windows 上,它始终返回字符串 /REGISTRY-NOTFOUND。
32
查询32位注册表。
64_32
查询两个视图(64 和 32)并为每个视图生成路径。
32_64
查询两个视图(32 和 64)并为每个视图生成路径。
HOST
查询与主机架构匹配的注册表:64位Windows上为64,32位Windows上为32。
TARGET
查询与 CMAKE_SIZEOF_VOID_P 变量指定的体系结构匹配的注册表。 如果未定义,则返回到 HOST 视图。
BOTH
查询两个视图(32 和 64)。 该顺序取决于以下规则: 如果定义了 CMAKE_SIZEOF_VOID_P 变量,则根据该变量的内容使用以下视图:

  • 8: 64_32
  • 4: 32_64
    如果未定义 CMAKE_SIZEOF_VOID_P 变量,则依赖于主机的架构:
  • 64-bit: 64_32
  • 32-bit: 32

如果指定了 PATH_SUFFIXES,则后缀将一一附加到每个 (W) 或 (U) 目录条目。
这组目录旨在与在其安装树中提供配置文件的项目配合使用。 上面标有 (W) 的目录适用于 Windows 上的安装,其中前缀可能指向应用程序安装目录的顶部。 标有 (U) 的那些适用于在 UNIX 平台上安装,其中多个软件包共享前缀。 这只是一个约定,因此仍然会在所有平台上搜索所有 (W) 和 (U) 目录。 标有 (A) 的目录适用于 Apple 平台上的安装。 CMAKE_FIND_FRAMEWORK 和 CMAKE_FIND_APPBUNDLE 变量确定优先顺序。
安装前缀集是使用以下步骤构建的。 如果指定了 NO_DEFAULT_PATH,则启用所有 NO_* 选项。
1.搜索当前发现的 <PackageName> 特有的前缀。 请参阅政策 CMP0074。
3.12 版本中的新功能。
具体来说,搜索由以下变量按顺序指定的前缀:
a.<PackageName>_ROOT CMake 变量,其中 <PackageName> 是保留大小写的包名称。
b.<PACKAGENAME>_ROOT CMake 变量,其中 <PACKAGENAME> 是大写的包名称。 请参阅政策 CMP0144。
3.27 版本中的新功能。
c.<PackageName>_ROOT 环境变量,其中 <PackageName> 是保留大小写的包名称。
d.<PACKAGENAME>_ROOT 环境变量,其中 <PACKAGENAME> 是大写的包名称。 请参阅政策 CMP0144。
包根变量以堆栈的形式维护,因此如果从查找模块内调用,则还将在当前包的路径之后搜索父级查找模块的根路径。 如果传递 NO_PACKAGE_ROOT_PATH 或将 CMAKE_FIND_USE_PACKAGE_ROOT_PATH 设置为 FALSE,则可以跳过此操作。
2.在 cmake 特定的缓存变量中指定的搜索路径。 这些旨在通过 -DVAR=VALUE 在命令行上使用。 这些值被解释为以分号分隔的列表。 如果传递 NO_CMAKE_PATH 或将 CMAKE_FIND_USE_CMAKE_PATH 设置为 FALSE,则可以跳过此操作:

  • CMAKE_PREFIX_PATH
  • CMAKE_FRAMEWORK_PATH
  • CMAKE_APPBUNDLE_PATH

3.搜索特定于 cmake 的环境变量中指定的路径。 这些旨在在用户的 shell 配置中进行设置,因此使用主机的本机路径分隔符(在 Windows 上为 ; 在 UNIX 上为 :)。 如果传递 NO_CMAKE_ENVIRONMENT_PATH 或将 CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH 设置为 FALSE,则可以跳过此操作:

  • <PackageName>_DIR
  • CMAKE_PREFIX_PATH
  • CMAKE_FRAMEWORK_PATH
  • CMAKE_APPBUNDLE_PATH

4.由 HINTS 选项指定的搜索路径。这些应该是由系统自省计算的路径,例如由已找到的另一个项目的位置提供的提示。 应使用 PATHS 选项指定硬编码猜测。
5.搜索标准系统环境变量。如果传递 NO_SYSTEM_ENVIRONMENT_PATH 或将 CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH 设置为 FALSE,则可以跳过此操作。 以 /bin 或 /sbin 结尾的路径条目会自动转换为其父目录:
PATH
6.搜索存储在 CMake 用户包注册表中的路径。如果传递 NO_CMAKE_PACKAGE_REGISTRY 或通过将变量 CMAKE_FIND_USE_PACKAGE_REGISTRY 设置为 FALSE 或将已弃用的变量 CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY 设置为 TRUE,则可以跳过此操作。
7.搜索当前系统的平台文件中定义的 cmake 变量。如果传递 NO_CMAKE_INSTALL_PREFIX 或将 CMAKE_FIND_USE_INSTALL_PREFIX 设置为 FALSE,则可以跳过 CMAKE_INSTALL_PREFIX 和 CMAKE_STAGING_PREFIX 的搜索。 如果传递 NO_CMAKE_SYSTEM_PATH 或将 CMAKE_FIND_USE_CMAKE_SYSTEM_PATH 设置为 FALSE,则可以跳过所有这些位置:

  • CMAKE_SYSTEM_PREFIX_PATH
  • CMAKE_SYSTEM_FRAMEWORK_PATH
  • CMAKE_SYSTEM_APPBUNDLE_PATH

这些变量包含的平台路径是通常包含已安装软件的位置。 一个示例是基于 UNIX 的平台的 /usr/local。
8.搜索存储在 CMake 系统包注册表中的路径。如果传递 NO_CMAKE_SYSTEM_PACKAGE_REGISTRY 或通过将 CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY 变量设置为 FALSE 或将已弃用的变量 CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY 设置为 TRUE,则可以跳过此操作。
有关系统包注册表的详细信息,请参阅 cmake-packages(7) 手册。
9.搜索由 PATHS 选项指定的路径。 这些通常是硬编码的猜测。
CMAKE_IGNORE_PATH、CMAKE_IGNORE_PREFIX_PATH、CMAKE_SYSTEM_IGNORE_PATH 和 CMAKE_SYSTEM_IGNORE_PREFIX_PATH 变量也可能导致上述某些位置被忽略。
版本 3.16 中的新增功能:添加了 CMAKE_FIND_USE_ 变量以全局禁用各种搜索位置。
CMake 变量 CMAKE_FIND_ROOT_PATH 指定要添加到所有其他搜索目录之前的一个或多个目录。 这有效地“重新定位”给定位置下的整个搜索。 CMAKE_STAGING_PREFIX 的后代路径被排除在此重新根目录之外,因为该变量始终是主机系统上的路径。 默认情况下 CMAKE_FIND_ROOT_PATH 为空。
CMAKE_SYSROOT 变量还可用于指定一个目录作为前缀。 设置 CMAKE_SYSROOT 还具有其他效果。 有关更多信息,请参阅该变量的文档。
当交叉编译指向目标环境的根目录并且 CMake 也会在那里搜索时,这些变量特别有用。 默认情况下,首先搜索 CMAKE_FIND_ROOT_PATH 中列出的目录,然后搜索 CMAKE_SYSROOT 目录,然后搜索非根目录。 可以通过设置 CMAKE_FIND_ROOT_PATH_MODE_PACKAGE 来调整默认行为。 可以使用选项在每次调用的基础上手动覆盖此行为:
CMAKE_FIND_ROOT_PATH_BOTH
按照上述顺序进行搜索。
NO_CMAKE_FIND_ROOT_PATH
不要使用 CMAKE_FIND_ROOT_PATH 变量。
ONLY_CMAKE_FIND_ROOT_PATH
仅搜索重新根目录和 CMAKE_STAGING_PREFIX 下面的目录。
对于常见用例,默认搜索顺序被设计为从最具体到最不具体。 项目可以通过简单地多次调用该命令并使用 NO_* 选项来覆盖该顺序:

find_package (<PackageName> PATHS paths... NO_DEFAULT_PATH)
find_package (<PackageName>)

一旦其中一个调用成功,结果变量将被设置并存储在缓存中,以便不会再次搜索调用。
默认情况下,存储在结果变量中的值将是找到文件的路径。 在调用 find_package 之前,可以将 CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS 变量设置为 TRUE,以便解析符号链接并存储文件的真实路径。
每个非必需的 find_package 调用都可以禁用或设为必需:

  • 将 CMAKE_DISABLE_FIND_PACKAGE_<PackageName> 变量设置为 TRUE 将禁用该包。 这也会禁用重定向到 FetchContent 提供的包。
  • 将 CMAKE_REQUIRE_FIND_PACKAGE_<PackageName> 变量设置为 TRUE 会使包成为必需的。

同时将两个变量设置为 TRUE 是错误的。

配置模式版本选择

注意:当使用配置模式时,无论给出的是完整签名还是基本签名,都会应用此版本选择过程。
当给出 [version] 参数时,Config 模式将仅查找声称与请求版本兼容的包版本(请参阅格式规范)。如果给出了 EXACT 选项,则只能找到声称与所请求版本完全匹配的包版本。CMake 没有为版本号的含义建立任何约定。 包版本号由包本身或 FetchContent 提供的“版本”文件检查。对于候选包配置文件\ .cmake,相应的版本文件位于其旁边,并命名为 <config-file>-version.cmake 或 <config-file>Version.cmake。如果没有此类版本文件可用,则假定配置文件与任何请求的版本不兼容。可以使用 CMakePackageConfigHelpers 模块创建包含通用版本匹配代码的基本版本文件。当找到版本文件时,将加载该文件以检查请求的版本号。 版本文件加载到嵌套作用域中,其中定义了以下变量:
PACKAGE_FIND_NAME
包的名称
PACKAGE_FIND_VERSION
完整请求的版本字符串
PACKAGE_FIND_VERSION_MAJOR
需要的主要版本,默认为 0
PACKAGE_FIND_VERSION_MINOR
要求的次要版本,默认为 0
PACKAGE_FIND_VERSION_PATCH
要求三维补丁的版本,默认为 0
PACKAGE_FIND_VERSION_TWEAK
要求的调整版本,默认为0
PACKAGE_FIND_VERSION_COUNT
版本组件的数量,0 到 4
当指定版本范围时,上述版本变量将根据版本范围的下限保存值。 这是为了保持与尚未实现预期版本范围的软件包的兼容性。 另外,版本范围将通过以下变量来描述:
PACKAGE_FIND_VERSION_RANGE
要求的版本范围的完整字符
PACKAGE_FIND_VERSION_RANGE_MIN
这指定是否应包含或排除版本范围的下端点。 目前,此变量唯一支持的值是 INCLUDE。
PACKAGE_FIND_VERSION_RANGE_MAX
这指定是否应包含或排除版本范围的上端点。 该变量支持的值为 INCLUDE 和 EXCLUDE。
PACKAGE_FIND_VERSION_MIN
范围下端点的完整请求版本字符串
PACKAGE_FIND_VERSION_MIN_MAJOR
如果需要,则为下端点的主要版本,否则为 0
PACKAGE_FIND_VERSION_MIN_MINOR
如果需要,则为下端点的次要版本,否则为 0
PACKAGE_FIND_VERSION_MIN_PATCH
如果需要,则下端点的补丁版本,否则为 0
PACKAGE_FIND_VERSION_MIN_TWEAK
如果需要,调整下端点的版本,否则为 0
PACKAGE_FIND_VERSION_MIN_COUNT
下端点的版本组件数量,0到4
PACKAGE_FIND_VERSION_MAX
范围上端点的完整请求版本字符串
PACKAGE_FIND_VERSION_MAX_MAJOR
如果需要,则为上端点的主要版本,否则为 0
PACKAGE_FIND_VERSION_MAX_MINOR
如果需要,上端点的次版本,否则为 0
PACKAGE_FIND_VERSION_MAX_PATCH
如果需要,上端点的补丁版本,否则为 0
PACKAGE_FIND_VERSION_MAX_TWEAK
如果需要,调整上端点的版本,否则为 0
PACKAGE_FIND_VERSION_MAX_COUNT
上端点的版本组件数量,0到4
无论指定单个版本还是版本范围,都会定义变量 PACKAGE_FIND_VERSION_COMPLETE 并将保存指定的完整请求版本字符串。
版本文件检查它是否满足请求的版本并设置这些变量:
PACKAGE_VERSION
提供的完整版本字符串
PACKAGE_VERSION_EXACT
如果版本完全匹配则为 True
PACKAGE_VERSION_COMPATIBLE
如果版本兼容则为 True
PACKAGE_VERSION_UNSUITABLE
如果不适合任何版本则为 True
find_package 命令检查这些变量以确定配置文件是否提供可接受的版本。 find_package 调用返回后它们不可用。 如果版本可接受,则设置以下变量:
<PackageName>_VERSION
提供的完整版本字符串
<PackageName>_VERSION_MAJOR
主版本(如果提供),否则为 0
<PackageName>_VERSION_MINOR
次版本(如果提供),否则为 0
<PackageName>_VERSION_PATCH
补丁版本(如果提供),否则为 0
<PackageName>_VERSION_TWEAK
调整版本(如果提供),否则为 0
<PackageName>_VERSION_COUNT
版本的组件,0-4
并加载相应的包配置文件。 当多个包配置文件可用且其版本文件声明与请求的版本兼容时,未指定选择哪一个:除非设置了变量 CMAKE_FIND_PACKAGE_SORT_ORDER,否则不会尝试选择最高或最接近的版本号。
要控制 find_package 检查兼容性的顺序,请使用两个变量 CMAKE_FIND_PACKAGE_SORT_ORDER 和 CMAKE_FIND_PACKAGE_SORT_DIRECTION。 例如为了选择可以设置的最高版本

SET(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC)

在调用 find_package 之前使用这段代码。

包文件接口变量

加载查找模块或包配置文件时 find_package 定义变量来提供有关调用参数的信息(并在返回之前恢复其原始状态):
CMAKE_FIND_PACKAGE_NAME
搜索的<PackageName>
<PackageName>_FIND_REQUIRED
如果给出了 REQUIRED 选项,则为 True
<PackageName>_FIND_QUIETLY
如果给出了 QUIET 选项,则为 True
<PackageName>_FIND_REGISTRY_VIEW
如果给出了 REGISTRY_VIEW选项,则为 True
<PackageName>_FIND_VERSION
完整请求的版本字符串
<PackageName>_FIND_VERSION_MAJOR
如果需要的话主要版本,否则 0
<PackageName>_FIND_VERSION_MINOR
如果需要的话次要版本,否则 0
<PackageName>_FIND_VERSION_PATCH
如果需要的话主补丁版本,否则 0
<PackageName>_FIND_VERSION_TWEAK
如果需要的话调整版本,否则 0
<PackageName>_FIND_VERSION_COUNT
版本组件的数量,0 到 4
<PackageName>_FIND_VERSION_EXACT
如果给出了 EXACT 选项,则为 True
<PackageName>_FIND_COMPONENTS
指定组件列表(必需和可选)
<PackageName>FIND_REQUIRED<c>
如果组件\ 是必需的,则为 true;如果组件 <c> 是可选的,则为 false
当指定版本范围时,上述版本变量将根据版本范围的下限保存值。 这是为了保持与尚未实现预期版本范围的软件包的兼容性。 另外,版本范围将通过以下变量来描述:
<PackageName>_FIND_VERSION_RANGE
完整请求的版本范围字符串
<PackageName>_FIND_VERSION_RANGE_MIN
这指定是包含还是排除版本范围的下端点。 目前,INCLUDE 是唯一受支持的值。
<PackageName>_FIND_VERSION_RANGE_MAX
这指定是包含还是排除版本范围的上端点。 该变量的可能值为 INCLUDE 或 EXCLUDE。
<PackageName>_FIND_VERSION_MIN
范围下端点的完整请求版本字符串
<PackageName>_FIND_VERSION_MIN_MAJOR
如果需要,则为下端点的主要版本,否则为 0
<PackageName>_FIND_VERSION_MIN_MINOR
如果需要,则为下端点的次要版本,否则为 0
<PackageName>_FIND_VERSION_MIN_PATCH
如果需要,则为下端点的补丁版本,否则为 0
<PackageName>_FIND_VERSION_MIN_TWEAK
如果需要,则为下端点的调整版本,否则为 0
<PackageName>_FIND_VERSION_MIN_COUNT
下端点的版本组件数量,0到4
<PackageName>_FIND_VERSION_MAX
范围上端点的完整请求版本字符串
<PackageName>_FIND_VERSION_MAX_MAJOR
如果需要,则为上端点的主要版本,否则为 0
<PackageName>_FIND_VERSION_MAX_MINOR
如果需要,则为上端点的次要版本,否则为 0
<PackageName>_FIND_VERSION_MAX_PATCH
如果需要,则为上端点的补丁版本,否则为 0
<PackageName>_FIND_VERSION_MAX_TWEAK
如果需要,则为上端点的调整版本,否则为 0
<PackageName>_FIND_VERSION_MAX_COUNT
上端点的版本组件数量,0到4
无论指定单个版本还是版本范围,都会定义变量\ _FIND_VERSION_COMPLETE,并将保存指定的完整请求版本字符串。
在模块模式下,加载的查找模块负责满足这些变量详细说明的请求; 有关详细信息,请参阅查找模块。 在配置模式下,find_package 自动处理 REQUIRED、QUIET 和 [version] 选项,但将其留给包配置文件,以便以对包有意义的方式处理组件。 包配置文件可以将 <PackageName>_FOUND 设置为 false 以告诉 find_package 组件要求未得到满足

`find_package` 是 CMake 用于查找和加载外部依赖库的命令。它会在系统搜索指定名称的库,并自动配置编译选项。一般情况下,我们需要在 CMakeLists.txt 文件使用 `find_package` 命令来查找我们需要的库,然后将它们链接到我们的项目。 下面是使用 `find_package` 命令的一般步骤: 1. 在 CMakeLists.txt 文件使用 `find_package` 命令,指定要查找的库的名称和版本。 例如,要查找 Boost 库,可以使用以下命令: ``` find_package(Boost 1.46 REQUIRED COMPONENTS system thread) ``` 2. 如果库没有被找到,可以通过设置 `CMAKE_PREFIX_PATH` 环境变量或者 `CMAKE_MODULE_PATH` 变量来指定库的安装路径或者 CMake 模块所在路径。 3. 如果找到了库,`find_package` 命令会自动定义一些变量,用于指定库的路径、头文件路径和库文件路径等信息。 例如,对于 Boost 库,`find_package` 命令会定义以下变量: ``` Boost_FOUND Boost_INCLUDE_DIRS Boost_LIBRARY_DIRS Boost_LIBRARIES ``` 4. 在项目使用这些变量,例如: ``` include_directories(${Boost_INCLUDE_DIRS}) link_directories(${Boost_LIBRARY_DIRS}) target_link_libraries(my_target ${Boost_LIBRARIES}) ``` 这些变量包含了库的路径信息,可以用来编译和链接项目。 需要注意的是,`find_package` 命令只能用于已经被 CMake 支持的库。对于一些非常规的库,可能需要手动配置编译选项来使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值