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
相关产品推荐
相关产品推荐

