04 cmake关于find_packet使用

本章要讨论的问题:如何使用切换多个版本的依赖包?

学习find_packet,并掌握以下内容:

  • 明确find_packet() 的查找顺序
  • 使用find_packet()找到非cmake构建安装的包

find_packet()的用法

find_packet()有两种模式,Module模式和Config模式,其中Module模式是基础用法,Config模式较为复杂。

Module模式下,如果按照用户指定的配置找不到包,主会自动进入Config模式

Module模式

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

version 如果指定就必须检查找到的包的版本是否与version兼容
EXACT 与version配合使用,如果指定version的同时又指定EXACT,必须检查找到的包的版本是否与version匹配
QUIET 如果查找失败,不会在屏幕上输出(如果指定了REQUIRED,则QUIET失效)
MODULE 只在Module模式下查找
REQUIRED 表示一定要找到包,如果失败则停止cmake
COMPONENTS components 表示一定要找到组件,如果失败则停止cmake
OPTIONAL_COMPONENTS components 表示找不到组件,也继续执行cmake

查找顺序:
Module模式下查找名为 Find<PackageName>.cmake 的文件

先在 CMAKE_MODULE_PATH 变量对应的路径下查找,如果路径为空或者查找失败,则在cmake安装时的module目录下查找

Config模式

find_package(<PackageName> [version] [EXACT] [QUIET]
[REQUIRED] [[COMPONENTS] [components...]]
[CONFIG|NO_MODULE]
[NO_POLICY_SCOPE]
[NAMES name1 [name2 ...]]
[CONFIGS config1 [config2 ...]]
[HINTS path1 [path2 ... ]]
[PATHS path1 [path2 ... ]]
[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_SYSTEM_PACKAGE_REGISTRY]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH])

查找顺序:
Config模式下查找名为 <PackageName>.Config.cmake<lower-case-package-name>-config.cmake 的文件。查找顺序如下:

  1. <PackageName>_ROOT 的cmake变量或者环境变量

    注意:如果指定了 <PackageName>_DIR cmake变量,那么 <PackageName>_ROOT 将不起作用

  2. cmake特定的缓存变量
    CMAKE_PREFIX_PATH
    CMAKE_FRAMEWORK_PATH
    CMAKE_APPBUNDLE_PATH

    可以通过设定NO_CMAKE_PATH来关闭这一查找顺序

  3. cmake待定的环境变量
    <PackageName>_DIR
    CMAKE_PREFIX_PATH
    CMAKE_FRAMEWORK_PATH
    CMAKE_APPBUNDLE_PATH

    可以通过NO_CMAKE_ENVIRONMENT_PATH来跳过

  4. HINT字段指定的路径

  5. 系统环境变量PATH

    其中如果是以/bin或者/sbin结尾的,会自动转化为其父目录
    通过指定NO_SYSTEM_ENVIRONMENT_PATH来跳过

  6. 存储在cmake的"User Package Registry"(用户包注册表)中的路径。

    通过设定NO_CMAKE_PACKAGE_REGISTRY,或者:设定CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY为true来避开

  7. 设定为当前系统定义的cmake变量:
    CMAKE_SYSTEM_PREFIX_PATH
    CMAKE_SYSTEM_FRAMEWORK_PATH
    CMAKE_SYSTEM_APPBUNDLE_PATH

    通过设定NO_CMAKE_SYSTEM_PATH来跳过

  8. 在cmake的"System Package Registry"(系统包注册表)中查找。

    通过设定NO_CMAKE_SYSTEM_PACKAGE_REGISTRY跳过。或者通过设定CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY为true

  9. 从PATHS字段指定的路径中查找

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章