二次执行rebuild_cache时CMake解析execute_process输出报错
问题根源分析
你的代码核心问题是错误使用ERROR_VARIABLE捕获标准输出内容,具体细节如下:
输出流捕获逻辑错误
demo.cmake中的message("${GIT_VERSION}")默认输出到标准输出(stdout),但你在execute_process里用ERROR_VARIABLE my_VERSION仅能捕获**标准错误(stderr)**的内容,两者完全不匹配。不同执行场景的流行为差异
- 首次配置时: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的版本字符串,因此配置恢复正常。
- 首次配置时:CMake的环境特性导致message输出被意外重定向到stderr,
修复方案
将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
相关产品推荐
相关产品推荐

