未指定ERROR_VARIABLE时CMake string(JSON)报错不退出是否符合预期?
排查CMake string(JSON)错误未终止构建的问题
可能的原因及解决办法
1. CMake版本差异
Ubuntu 22.04默认自带的CMake版本是3.22.1,而string(JSON)命令的错误处理逻辑在后续版本(比如3.24+)才严格遵循官方文档描述——未指定ERROR_VARIABLE时触发致命错误终止构建。在3.22版本中,该命令的错误仅会输出提示,但不会中断构建流程。
验证方式:
运行cmake --version确认当前使用的版本,如果是3.22或更早版本,就会出现你遇到的问题。
解决办法:
手动通过ERROR_VARIABLE捕获错误并主动终止构建,示例代码:
# 读取版本信息并捕获错误 string(JSON APP_VERSION GET "${CMAKE_CURRENT_SOURCE_DIR}/config.json" "app_version" ERROR_VARIABLE JSON_READ_ERROR) # 检查错误并触发致命错误 if(JSON_READ_ERROR) message(FATAL_ERROR "读取config.json版本信息失败: ${JSON_READ_ERROR}") endif()
2. 错误被意外抑制
检查你的CMake脚本中是否存在以下可能抑制错误的设置:
- 启用了
CMAKE_SUPPRESS_DEVELOPER_WARNINGS变量,该变量会隐藏部分开发相关的警告和错误 - 使用了
--no-warn-unused-cli等命令行参数启动CMake,可能影响错误的处理逻辑
验证方式:
去掉所有自定义的CMake启动参数,仅用基础命令cmake ..重新测试,看错误是否会终止构建。
3. 脚本逻辑的间接影响
如果你的string(JSON)调用被包裹在execute_process、try_compile等命令块中,这些命令可能会捕获错误并继续执行后续逻辑,导致构建不会终止。
解决办法:
确保string(JSON)是直接在主脚本流程中调用,而非被其他能捕获错误的命令包裹。
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

