谈谈 CMake 中的 find_package
 
			1.find_package 说明
find_package 是 CMake 中用于 查找外部库或包 的命令。它的主要作用是帮助 CMake 找到第三方库、工具或模块,并导入它们所需的信息(如库路径、头文件路径、链接依赖关系等),以便项目可以顺利进行编译和链接。
1.1 工作原理
find_package 会在系统指定的路径中查找某个包,并加载与该包相关的信息。可以通过下面这种方式查看系统路径:
| 1 | foreach(path ${CMAKE_SYSTEM_PREFIX_PATH}) | 
会输出:
| 1 | -- /usr/local | 
查找包时,它主要依赖以下机制:
- 查找路径
 CMake 会按顺序查找以下路径来寻找包:- 用户指定的路径:通过 CMAKE_PREFIX_PATH或PATHS参数指定的路径。
- 默认路径:
 - 系统路径。
- 环境变量,如 CMAKE_MODULE_PATH和CMAKE_FIND_ROOT_PATH。
 - CMake 模块路径:CMake 内置的模块搜索路径。
- 自定义的查找脚本:
 - 自定义的 <package>Config.cmake文件。
- Find<Package>.cmake模块文件。
 
- 用户指定的路径:通过 
CMake 按照这些路径的顺序进行搜索,找到第一个匹配的结果即停止。
- 工作模式 - find_package有两种主要工作模式:- Config 模式(配置文件模式) 
 查找- <Package>Config.cmake或- <lowercase-package>-config.cmake文件。该模式通常用于现代 CMake 兼容的库或第三方项目,它们会生成配置文件供 CMake 使用。
- Module 模式(模块文件模式) 
 查找- Find<Package>.cmake文件。此模式通常用于 CMake 自带的模块文件或用户定义的模块文件。
 
- 工作流程 
 当你调用- find_package(<Package> REQUIRED)时:- 首先查找 <Package>Config.cmake配置文件。
- 如果找不到,再查找 Find<Package>.cmake模块文件。
- 成功找到后,CMake 会设置一系列变量(如 <Package>_INCLUDE_DIRS、<Package>_LIBRARIES等),这些变量可以在后续的target_include_directories和target_link_libraries中使用。
- 如果添加 REQUIRED选项但未找到包,CMake 将报错。
 
- 首先查找 
1.2 基本语法
| 1 | find_package(<PackageName> [version] [EXACT] [QUIET] [REQUIRED] [MODULE]) | 
参数说明:
- <PackageName>:要查找的包名。
- [version]:指定包的版本号,例如- 1.2.3。
- EXACT:要求找到的版本必须完全匹配指定的版本号。
- QUIET:找到包时不输出查找过程的日志信息。
- REQUIRED:如果未找到包,CMake 将终止配置并报错。
- MODULE:强制 CMake 只查找- Find<Package>.cmake模块文件,而不查找- <Package>Config.cmake。
1.3 使用 find_package 的结果
find_package 成功找到包后,通常会设置一些变量,用户可以使用这些变量来链接库、包含头文件等。
常见的变量包括:
- <Package>_FOUND:是否找到包,值为- TRUE或- FALSE。
- <Package>_INCLUDE_DIRS:包的头文件目录。
- <Package>_LIBRARIES:包的库文件路径。
- <Package>_VERSION:找到的包的版本号。
2.注意点
在 CMake 中,find_package 对包名是 大小写敏感 的,包名必须与库提供的 <Package>Config.cmake 文件名、模块文件名(如 Find<Package>.cmake)中的定义 完全匹配 。
在不确定大小写时,可以通过查找库的 CMake 配置文件 方式来确定,通常位于库的安装路径下:
| 1 | find /usr /opt -name "*Config.cmake" | 
例如,找到 /usr/lib/cmake/Qt5/Qt5Config.cmake,说明包名是 Qt5。
- Title: 谈谈 CMake 中的 find_package
- Author: loskyertt
- Created at : 2024-12-16 13:13:17
- Updated at : 2025-02-17 04:36:55
- Link: https://redefine.ohevan.com/2024/12/16/cmake中的find_package/
- License: This work is licensed under CC BY-NC-SA 4.0.
