You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:42:20