CMake自动填充变量逻辑存疑:如何知晓变量及查看全量变量?
关于CMake变量的两个常见问题解答
1. 如何知晓find_package生成的变量,以及它们的生成逻辑?
首先,find_package的变量生成遵循CMake的通用命名规范,同时每个包的查找模块(比如FindBoost.cmake)会额外定义特定变量:
- 通用规范变量:所有通过
find_package找到的包都会生成这类变量,比如:<PackageName>_FOUND:标记包是否成功找到<PackageName>_INCLUDE_DIRS:包的头文件路径集合<PackageName>_LIBRARIES:包的链接库集合(就是你遇到的Boost_LIBRARIES)
- 包特定变量:每个包的查找模块会根据自身特性定义额外变量,比如Boost的
Boost_<Component>_LIBRARY(如Boost_filesystem_LIBRARY)、Boost_VERSION等。
要找到这些变量的具体信息,有几个实用方法:
- 查看对应查找模块的文档:在WSL终端运行
cmake --help-module FindBoost,就能直接查看Boost查找模块的所有变量说明和用法;其他包同理,把FindBoost换成对应的Find<PackageName>即可。 - 直接查看查找模块的源码:CMake的模块文件通常放在安装目录的
Modules文件夹下(比如WSL里可能是/usr/share/cmake-<version>/Modules/),打开FindBoost.cmake就能看到所有变量的定义逻辑。 - 遵循命名惯例:通用变量的命名是固定模式,大部分包都会遵守,比如找Qt的话,
Qt5_LIBRARIES、Qt5_INCLUDE_DIRS这类变量肯定存在。
生成逻辑其实很直接:find_package会调用对应的Find<Package>.cmake模块文件,模块里通过find_path、find_library等指令定位包的头文件、库文件,然后把这些结果赋值到预定义的变量里,有些变量是模块根据查找结果动态拼接生成的(比如Boost_LIBRARIES就是把你指定的组件对应的库目标拼接起来)。
2. 如何获取所有已设置变量(含隐藏变量)的列表?
有两种常用方式:
终端命令行方式:在你的CMake构建目录下,运行
cmake -LAH命令。其中:-L:列出所有非高级变量-A:同时列出高级变量(也就是所谓的“隐藏变量”,通常是CMake内部或模块生成的带下划线前缀的变量)
如果是外部构建(比如在build目录下运行cmake指向源码目录),可以用cmake -LAH ..。
在CMakeLists.txt中打印:添加一段代码来遍历并打印所有变量:
get_cmake_property(_all_vars VARIABLES) list(SORT _all_vars) foreach(_var ${_all_vars}) message(STATUS "${_var} = ${${_var}}") endforeach()这段代码会获取所有变量名,排序后逐个打印变量名和对应的值,运行CMake时就能在输出里看到所有变量(包括隐藏的)。
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

