CMake set指令失效:变量值无法存储的问题求助
变量作用域限制:CMake变量默认具有作用域,若
B2_BOOST_TOOLSET是在函数/宏内部定义的局部变量,外部作用域无法访问。比如在函数内直接set(B2_BOOST_TOOLSET gcc),函数外调用message会输出空值。解决时需根据需求添加作用域修饰:- 若要让变量传递到父作用域,使用
set(B2_BOOST_TOOLSET gcc PARENT_SCOPE) - 若要全局持久化,可将变量设为缓存变量:
set(B2_BOOST_TOOLSET gcc CACHE STRING "Boost build toolset")
- 若要让变量传递到父作用域,使用
变量名拼写不一致:CMake变量名区分大小写,检查
set时的变量名和message中引用的是否完全一致,比如是否把B2_BOOST_TOOLSET误写为B2_BOOST_TOOLSETT或b2_boost_toolset。设置语句被条件分支跳过:如果
set(B2_BOOST_TOOLSET ...)被包裹在if()/else()等条件块中,需确认条件是否成立。例如仅在WIN32分支设置变量,但当前构建环境是Linux,变量就不会被初始化。可给变量设置默认值避免空值:set(B2_BOOST_TOOLSET "default_toolset" CACHE STRING "Boost build toolset")变量被后续脚本覆盖:检查
DownloadBoost.cmake被include后,是否有其他CMake脚本重新将B2_BOOST_TOOLSET设为空值。可在include(DownloadBoost.cmake)前后分别添加message(STATUS "Pre-include: ${B2_BOOST_TOOLSET}")和message(STATUS "Post-include: ${B2_BOOST_TOOLSET}")来定位覆盖点。旧版本CMake特性限制:CMake 3.13.4属于较早版本,部分变量作用域或缓存机制的行为可能与新版本不同。例如嵌套函数中使用
PARENT_SCOPE可能存在传递问题,可尝试将变量定义移至全局作用域,避开函数嵌套场景。
内容的提问来源于stack exchange,提问作者RUBEN IÑIGO TEJEDOR

