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

使用Visual Studio生成器时CMake add_custom_command分号参数问题

解决Visual Studio生成器下CMake传递含分号参数的问题

针对你的场景,以下是能在Visual Studio生成器下正常工作的CMake代码:

set(FOO "baz;bar")

add_custom_command(
  OUTPUT whatever
  COMMAND custom-compiler.py "--include=$<JOIN:${FOO},;>"
  COMMAND_EXPAND_LISTS
)

如果不需要变量复用,也可以直接写为:

add_custom_command(
  OUTPUT whatever
  COMMAND custom-compiler.py "--include=baz$<SEMICOLON>bar"
)

为什么之前的方法失效?

CMake中,分号;是列表的默认分隔符,Visual Studio生成器在处理命令行参数时,会将列表元素自动用引号包裹并以空格分隔,这就导致你要么得到空格替换分号的结果,要么因为手动加引号出现baz";"bar这类异常格式。而Ninja生成器对命令行参数的处理逻辑更直接,不会自动拆分带分号的参数。

关键原理

  • $<JOIN:${FOO},;>:将列表FOO的元素用分号连接成单一字符串,避免CMake将其拆分为多个列表项。
  • COMMAND_EXPAND_LISTS:确保生成器表达式和列表展开在生成构建文件时正确执行,同时让CMake将连接后的字符串作为单一参数传递。
  • 外层的双引号:告诉Visual Studio生成器将整个--include=baz;bar视为一个完整的命令行参数,不会拆分内部的分号。

如果需要保留生成器表达式定义变量的方式,也可以这样调整:

set(FOO "baz$<SEMICOLON>bar")

add_custom_command(
  OUTPUT whatever
  COMMAND custom-compiler.py "--include=${FOO}"
  COMMAND_EXPAND_LISTS
)

这样在生成阶段,$<SEMICOLON>会被展开为分号,同时双引号和COMMAND_EXPAND_LISTS确保整个参数被正确传递给编译器脚本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 17:48:15