怎么避免CMake在带空格的字符串中自动添加转义反斜杠
CMake参数拼接传递时自动转义空格的解决方案
问题根因
你遇到的转义问题是CMake的正常参数解析逻辑导致的:你将所有参数拼接成了单个长字符串变量,CMake在将该变量传递给COMMAND类指令(包括execute_process、add_custom_command等)时,会把整个字符串识别为一个独立的命令行参数,因此会自动对字符串内部的空格加反斜杠转义,避免被系统拆分为多个参数。
而message命令输出时不会做命令行参数的转义处理,所以你会看到打印结果符合预期,但实际传递给执行程序时参数格式错误。
正确实现方式
不要手动拼接参数字符串,改用CMake列表存储参数,CMake会自动将列表的每个元素识别为独立的命令行参数,不会额外加转义符。
修改后的代码如下:
set(excludes "") foreach(XFILES IN LISTS ARGN) # 每次往列表中追加两个独立元素:--exclude 和 对应的过滤规则 list(APPEND excludes "--exclude" "${XFILES}") endforeach() # 后续传递给命令时直接使用${excludes}即可,不要加外层双引号 # 示例:add_custom_command(COMMAND your_prog ${excludes} ...)
注意事项
- 传递列表参数时不要给变量套外层双引号,例如写
COMMAND your_prog ${excludes}即可,如果写成COMMAND your_prog "${excludes}"会把整个列表重新转为单个字符串,再次触发转义问题。 - 列表在
message打印时会显示成分号分隔的形式,属于正常现象,传递给命令时会自动转为空格分隔的独立参数。
内容的提问来源于stack exchange,提问作者Arturo Gonzalez
相关产品推荐
相关产品推荐

