1.find_package 指定路径
1.1 命令
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[NO_POLICY_SCOPE])
参数解释
- packageName:待查找包的名称。此外它还决定两种搜索模下的.cmake文件名称:例如模块模式下的名称为Find.cmake,而配置模式下为-config.cmake/-config-version.cmake。
- MODULE:该选项指定find_package命令只使用模块模式搜索方式查找。未指定该选项时,find_package会优先使用模块模式搜索,仍未找到包时,会切换成配置模式搜索。
- version:待查找包的版本号要求,版本号为点分格式,由四个部分组成,每个部分都是一个数字,均为可选:major[.minor[.patch[.tweak]]],例如1.1.1.1、1.0、等。同样也可以指定版本范围(CMake 3.19及之后才支持),格式为:versionMin…[<]versionMax,versionMin和versionMax均是major[.minor[.patch[.tweak]]]形式的版本号,默认情况下会包含这个指定区间两端的版本号,但如果指定了<,那么会排除掉versionMax,例如1.1.1.1…1.1.2.0、1.1.1.1…<1.1.2.0等。
- EXACT:该选项要求待查找包的版本必须与指定的版本精确匹配,因此如果指定的是一个版本范围,不能使用该参数。
- QUIET:禁止输出信息,正常情况当找到包时,CMake会打印一些信息,指定该选项时会禁止掉这些打印。例外是当同时指定QUIET时,如果找不到包,仍然会输出错误信息并终止执行过程。
- REQUIRED:当未找到满足条件的包(例如版本号不匹配,或指定组件未找到等),会终止CMake的执行过程,并输出一条错误信息。如果未指定该选项,即使未找到满足条件的包,CMake的执行过程也会继续。
- COMPONENTS:指定要查找的组件。通常一个包可能包含多个组件(可以理解为多个库,例如把C++的std看成一个包的概念,那么vector就是std下的其中一个组件),我们的工程可能会依赖包下的具体某个组件,因此可以通过这个选项来检测这些组件是否存在。通常的约定是,该选项后的组件应该都找到时才认为包找到,否则认为未找到满足条件的包。这个约束会依赖包的.cmake来实现,通过find_package命令传入的COMPONENTS可以通过_FIND_COMPONENTS这个变量来获得。
1.2 find_package 指定路径
在CMakeList.txt我们经常看见find_package这个命令,如
find_package(yaml-cpp REQUIRED)
当找不到包时,则会报错,停止编译。
1.2.1 让 find_package 到指定路径找包,有三种方法
1 设置 DIR
set(yaml-cpp_DIR ~/yaml-cpp)
find_package(yaml-cpp REQUIRED)
2 设置PATHS
set(yaml-cpp required PATHS ~/yaml-cpp)
3 指定 DCMAKE_PREFIX_PATH
cmake -DCMAKE_PREFIX_PATH="~/yaml-cpp" ..