具有多个条目(空格?)的 Cmake 生成器表达式

Cmake Generator expressions with multiple entries (spaces?)

(在写这个问题的过程中,我找到了一个解决方案,所以这里只是记录一下,因为我事先真的需要它!)

我正在编写一个 C++ 项目并为其使用 cmake。

在我的 cmake 文件中有:

set(MY_DEBUG_WARNINGS "-Og -Wall"
)

# Add warnings:
add_compile_options("$<$<CONFIG:DEBUG>:${MY_DEBUG_WARNINGS}>"
"$<$<CXX_COMPILER_ID:Clang,AppleClang>:-fcolor-diagnostics>"
"$<$<CXX_COMPILER_ID:GNU>:-fdiagnostics-color>"
)

这不起作用,因为编译命令会拾取额外的转义引号:

  "/usr/bin/clang++ -I../src/Exception/include -g \"-Og -Wall\" -fcolor-diagnostics - 
  std=c++17 -o src/Exception/CMakeFiles/exception.dir/Exception.cpp.o -c 
  /home/bob/app/src/Exception/Exception.cpp",
  "file": "/home/bob/app/src/Exception/Exception.cpp"  

问题似乎是警告中的 space。

通过将每个值包装在它自己的表达式中来“解决”这个问题,这看起来很奇怪而且非常不切实际。 有没有更简单的方法可以在生成器表达式中传递带有 spaces 的字符串?

如前所述,我自己找到了一个可接受的解决方案,但尚未将其标记为我接受的答案,因为我不确定,这是一个很好的解决方案,而不是如果我需要分号时可能会咬我的 hack在选项本身。

确实是space的问题,可以这样解决:

 set(MY_DEBUG_WARNINGS "-Og;-Wall"
 )

用分号替换所有 space。这样编译命令就变成了:

 "/usr/bin/clang++ -I../src/Exception/include -g -Og -Wall 
 -fcolor-diagnostics -std=c++17 -o 
 src/Exception/CMakeFiles/exception.dir/Exception.cpp.o -c 
 /home/bob/app/src/Exception/Exception.cpp",

这确实有效。

我不知道这是否会在其他地方造成问题,因此非常感谢有更多知识的人发表评论。

"-Og -Wall" 是一个字符串,而 "-Og;-Wall" 是一个列表(因为列表是分号分隔的字符串)。

所以set(my_list -Og -Wall)(没有双引号)也创建了一个列表。阅读所有相关内容 here