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

CMake add_custom_command运行带管道重定向的Bash命令报错如何解决

CMake add_custom_command执行Bash命令报错的解决方案

问题根因

  • 多余的$符号:你在bash -c的命令开头加了不属于命令的shell提示符$,会直接导致shell解析命令错乱,原本的管道逻辑被拆分,所以会报sed命令不存在的错误。
  • 反向引用转义不足:sed需要的\1反向引用,在CMake字符串中需要经过两层转义(CMake解析转义一层,bash执行时再转义一层),你写的\\1最终传给sed时会变成普通字符1,无法生效,也会导致命令解析异常。
  • 参数拼写错误:add_custom_command中用于声明依赖的参数是DEPENDS,不是DEPENDENCY,错误参数会被CMake直接忽略。
  • 路径解析异常:第二个报错中输出路径前有多余空格,同时WSL混合环境下路径需要确保是WSL可识别的/mnt/格式,未提前创建输出目录也会触发不存在报错。
  • 缺少转义保护:没有加VERBATIM参数,CMake无法自动处理特殊字符的转义,容易出现空格、引号解析错误。

修正后的代码示例

# 提前创建输出目录,避免目录不存在报错
file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR})

add_custom_command(TARGET ${x}
        PRE_BUILD
        # 修正点:去掉开头的$,\1转义为\\\\1确保sed反向引用生效
        COMMAND bash -c "cpphs --nowarn --nomacro -I./ \"${source}\" | sed -E 's|#line 1 \"missing file: (.*)\"|#include <\\\\1>|' > ${CMAKE_SOURCE_DIR}/out.txt"
        DEPENDS ${x} # 修正点:DEPENDENCY改为正确的DEPENDS
        COMMENT "create sourcefiles"
        VERBATIM # 修正点:加VERBATIM让CMake自动处理参数转义
)

额外优化建议

  • 如果${source}路径包含空格,建议使用CMake的$<SHELL_PATH:${source}>生成shell安全的路径格式。
  • 调试阶段可以先加一行COMMAND bash -c "echo ${CMAKE_SOURCE_DIR}"打印输出路径,确认路径是否符合WSL的格式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:24:06