本章要讨论的问题:如何使用切换多个版本的依赖包?
学习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
的文件。查找顺序如下:
-
<PackageName>_ROOT 的cmake变量或者环境变量
注意:如果指定了 <PackageName>_DIR cmake变量,那么 <PackageName>_ROOT 将不起作用
-
cmake特定的缓存变量
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH可以通过设定NO_CMAKE_PATH来关闭这一查找顺序
-
cmake待定的环境变量
<PackageName>_DIR
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH可以通过NO_CMAKE_ENVIRONMENT_PATH来跳过
-
HINT字段指定的路径
-
系统环境变量PATH
其中如果是以/bin或者/sbin结尾的,会自动转化为其父目录
通过指定NO_SYSTEM_ENVIRONMENT_PATH来跳过 -
存储在cmake的"User Package Registry"(用户包注册表)中的路径。
通过设定NO_CMAKE_PACKAGE_REGISTRY,或者:设定CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY为true来避开
-
设定为当前系统定义的cmake变量:
CMAKE_SYSTEM_PREFIX_PATH
CMAKE_SYSTEM_FRAMEWORK_PATH
CMAKE_SYSTEM_APPBUNDLE_PATH通过设定NO_CMAKE_SYSTEM_PATH来跳过
-
在cmake的"System Package Registry"(系统包注册表)中查找。
通过设定NO_CMAKE_SYSTEM_PACKAGE_REGISTRY跳过。或者通过设定CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY为true
-
从PATHS字段指定的路径中查找