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

如何向CMake的add_compiler_options()传递含尖括号的编译选项?

解决CMake中Squish Coco编译选项因尖括号被自动加引号的问题

场景说明

在Windows系统下使用CMake 3.24.2构建项目,需要为Squish Coco代码覆盖率工具添加全局编译选项,要求不使用CMAKE_C_FLAGS_COVERAGE全局变量,目标选项为:

--cs-on --cs-output=P:\%F.<TEST_NAME>.${HOST_NAME}.%p.%t

但由于选项中包含尖括号<>,CMake会自动为第二个选项添加双引号,导致Coco工具忽略该选项。

之前的尝试及问题

  • 尝试1:

    add_compile_options("$<$<CONFIG:COVERAGE>:--cs-on;--cs-output=P:\%F.<TEST_NAME$<ANGLE-R>.${HOST_NAME}.%p.%t>")
    

    生成的compile_commands.json中出现多余引号:

    --cs-on \"--cs-output=P:\\coverage/%F.<TEST_NAME>.ca-pc39.%p.%t\"
    
  • 尝试2:手动添加引号

    add_compile_options("$<$<CONFIG:COVERAGE>:--cs-on;--cs-output=\"P:\%F.<TEST_NAME$<ANGLE-R>.${HOST_NAME}.%p.%t\">")
    

    结果出现多层转义引号:

    --cs-on \"--cs-output=\\\"P:\\coverage/%F.<TEST_NAME>.ca-pc39.%p.%t\\\"\"
    
  • 尝试3:移除所有尖括号
    得到无引号的正常格式,但丢失了<TEST_NAME>的必要结构:

    --cs-on --cs-output=P:\\coverage/%F.TEST_NAME.ca-pc39.%p.%t
    

解决方法

使用CMake的SHELL:生成器表达式前缀,强制跳过自动引号处理,直接传递带尖括号的选项。修改后的代码如下:

add_compile_options(
  "$<$<CONFIG:COVERAGE>:--cs-on>"
  "$<$<CONFIG:COVERAGE>:SHELL:--cs-output=P:\\%F.<TEST_NAME>.${HOST_NAME}.%p.%t>"
)

说明

  • SHELL:前缀会告诉CMake将后续内容直接作为编译器参数传递,不进行额外的引号转义或包裹,保留尖括号的原始结构。
  • 注意路径中的反斜杠需要转义为\\,避免CMake将其解析为转义字符。

修改后,compile_commands.json中会生成符合要求的无引号选项:

--cs-on --cs-output=P:\\coverage/%F.<TEST_NAME>.ca-pc39.%p.%t

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:52:54