CMake笔记:find_package工作原理
find_package 是 CMake 中用于查找并加载外部库或框架的命令,其工作原理涉及几个关键步骤和搜索策略。以下是 find_package 工作原理的详细解释:
1. 搜索模式
CMake 的 find_package 命令有两种主要的搜索模式:Module 模式和 Config 模式。
- Module 模式:
CMake 会在 CMAKE_MODULE_PATH 指定的路径下搜索名为 Find.cmake 的文件。
如果找到了这个文件,CMake 会执行它,以查找并设置库文件路径、头文件路径以及链接选项等。
CMAKE_MODULE_PATH 可以通过在 CMakeLists.txt 中使用 list(APPEND CMAKE_MODULE_PATH …) 或 set(CMAKE_MODULE_PATH …) 命令来设置。 - Config 模式:
如果 Module 模式未找到库,CMake 会尝试 Config 模式。
在这种模式下,CMake 会搜索 _DIR 指定的路径下的 Config.cmake 文件,或者搜索系统目录(如 /usr/local/lib/cmake//)中的该文件。
如果找到了 Config.cmake 文件,CMake 会执行它,以完成库的查找和配置。
2. 搜索顺序和优先级
CMake 默认首先尝试 Module 模式。
如果 Module 模式失败,并且没有显式禁用 Config 模式(通过 NO_MODULE 参数),CMake 会尝试 Config 模式。
在 Config 模式下,CMake 首先会在 _DIR 指定的路径中搜索,然后会在系统目录中搜索。
可以通过设置 CMAKE_PREFIX_PATH 环境变量或 CMake 变量来指定额外的搜索前缀路径,这会影响 Config 模式的搜索顺序。
3. 查找和设置变量
无论使用哪种模式,find_package 命令都会查找并设置一系列变量,以便在项目中使用这些库。
这些变量通常包括 _FOUND(表示库是否找到)、_INCLUDE_DIRS 或 _INCLUDES(头文件目录)、_LIBRARIES(库文件位置)等。
在 Config 模式下,这些变量可能由 Config.cmake 文件直接设置。
在 Module 模式下,这些变量由 Find.cmake 文件设置。
4. 错误处理和可选依赖
如果 find_package 命令找不到指定的库,并且使用了 REQUIRED 参数,CMake 会生成错误信息并停止配置过程。
如果使用了 QUIET 参数,CMake 在找不到库时不会输出错误信息,而是继续执行后续配置。
这对于处理可选依赖特别有用,因为即使找不到这些库,项目也可以继续配置和构建。
5. 自定义查找逻辑
如果 CMake 自带的 Find.cmake 模块不满足需求,用户可以编写自己的查找模块,并将其放在 CMAKE_MODULE_PATH 指定的路径下。
这允许用户根据自己的需求定制查找逻辑,例如指定特定的库版本、搜索特定的路径等。
综上所述,find_package 命令通过结合 Module 模式和 Config 模式、设置搜索路径和优先级、查找和设置变量以及处理错误和可选依赖等机制,为 CMake 项目提供了灵活且强大的外部库查找和加载功能。
参看
https://cmake.org/cmake/help/v3.21/command/find_package.html?highlight=find_package