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

