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

CMake add_custom_target使用Shell循环报错,求修复方案

修复CMake自定义目标中Shell循环的语法错误

问题原因

你写的CMake命令里,while循环的分号;会被CMake当作列表分隔符,再加上VERBATIM选项的转义处理,最终传递给shell的命令被拆分得不完整,导致shell解析时找不到do关键字,抛出语法错误。

修复方案

方案1:使用独立Shell脚本(推荐)

把文件处理逻辑写成单独的shell脚本,彻底避免CMake与shell的语法冲突:

  1. 在项目目录下创建process_temp.sh脚本:
#!/bin/bash
while read -r line; do
    echo "$line"
    # 这里可以添加你的其他处理逻辑
done < "$1"
  1. 在CMakeLists.txt中调用该脚本:
add_custom_target(mytarget
    COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/process_temp.sh ${CMAKE_CURRENT_BINARY_DIR}/temp.txt
    VERBATIM
)

如果脚本没有可执行权限,直接用sh或bash调用即可;也可以通过CMake的execute_process提前给脚本添加权限:

execute_process(COMMAND chmod +x ${CMAKE_CURRENT_SOURCE_DIR}/process_temp.sh)

方案2:直接修正COMMAND中的语法

如果不想单独写脚本,需要将整个shell循环用sh -c包裹,同时转义特殊字符,确保CMake把完整命令传递给shell:

add_custom_target(mytarget
    COMMAND sh -c "while read -r line; do echo \"\$line\"; done < '${CMAKE_CURRENT_BINARY_DIR}/temp.txt'"
    VERBATIM
)

注意点:

  • 用sh -c将整个循环作为单一命令传递给shell
  • 转义$为\$,避免CMake提前展开变量
  • 用单引号包裹文件路径,防止路径含空格时解析出错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:16:26