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

二次执行rebuild_cache时CMake解析execute_process输出报错

问题根源分析

你的代码核心问题是错误使用ERROR_VARIABLE捕获标准输出内容,具体细节如下:

  1. 输出流捕获逻辑错误
    demo.cmake中的message("${GIT_VERSION}")默认输出到标准输出(stdout),但你在execute_process里用ERROR_VARIABLE my_VERSION仅能捕获**标准错误(stderr)**的内容,两者完全不匹配。

  2. 不同执行场景的流行为差异

    • 首次配置时:CMake的环境特性导致message输出被意外重定向到stderr,my_VERSION能拿到正确的版本字符串,因此配置正常。
    • make rebuild_cache时:CMake的标准输出与错误流完全分离,ERROR_VARIABLE捕获不到任何内容,my_VERSION为空字符串。后续用string(REPLACE)拆分后得到空列表,执行list(GET)访问索引0、1、2时触发索引越界错误。
    • 使用--regenerate-during-build或重定向输出时:stdout与stderr被合并,ERROR_VARIABLE意外捕获到原本属于stdout的版本字符串,因此配置恢复正常。
修复方案

将execute_process中的ERROR_VARIABLE替换为OUTPUT_VARIABLE,同时添加OUTPUT_STRIP_TRAILING_WHITESPACE去除输出末尾的换行符,避免拆分后出现多余空元素:

execute_process(COMMAND ${CMAKE_COMMAND}
  -P ${CMAKE_CURRENT_SOURCE_DIR}/demo.cmake
  OUTPUT_VARIABLE my_VERSION
  OUTPUT_STRIP_TRAILING_WHITESPACE)

修改后,无论哪种执行方式,都能稳定捕获demo.cmake输出的版本字符串,彻底避免索引越界问题。

内容的提问来源于stack exchange,提问作者malat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:52:48