CMake中add_custom_command依赖文件列表转义问题如何解决
解决CMake add_custom_command依赖列表多余转义符问题
问题出在你用空格分隔的字符串存储依赖文件,而CMake的DEPENDS参数需要的是CMake原生列表(内部以分号分隔的元素集合)。当传递字符串时,CMake会把整个字符串当成单个依赖项,为处理其中的空格自动添加转义符,最终导致Make解析出错。
正确处理方式:用CMake列表构建依赖项
- 初始化空列表,替代原来的空字符串赋值:
set(MY_OBJECT_FILES) # 初始化空列表,无需赋值空字符串
- 用
list(APPEND)逐个添加目标文件到列表:
foreach(config ${CONFIGURATIONS}) list(APPEND MY_OBJECT_FILES "${CMAKE_CURRENT_BINARY_DIR}/generated-file-${config}.o") endforeach()
add_custom_command保持原有写法即可:
add_custom_command( OUTPUT my_output.out COMMAND ${MY_TOOL} ${PARAMETERS} DEPENDS ${MY_OBJECT_FILES} VERBATIM)
原理说明
CMake列表是原生多元素集合,当在DEPENDS中展开${MY_OBJECT_FILES}时,CMake会自动将列表元素转换为多个独立的依赖项,生成的built.make中不会出现多余转义符,依赖行将变为:
my_output.out: /home/user/project/build/generated-file-config1.o /home/user/project/build/generated-file-config2.o /home/user/project/build/generated-file-config3.o
特殊情况处理(已有空格分隔字符串)
如果因场景限制必须从空格分隔字符串转换为列表,可通过以下命令拆分:
string(REPLACE " " ";" MY_OBJECT_FILES "${MY_OBJECT_FILES}")
但优先推荐直接用list(APPEND)构建列表,避免字符串拼接带来的潜在问题。
内容的提问来源于stack exchange,提问作者Bibrak
相关产品推荐
相关产品推荐

