谈谈 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 : 2024-12-16 08:02:27
- Link: https://redefine.ohevan.com/2024/12/16/cmake中的find_package/
- License: This work is licensed under CC BY-NC-SA 4.0.