具有多个条目(空格?)的 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。
(在写这个问题的过程中,我找到了一个解决方案,所以这里只是记录一下,因为我事先真的需要它!)
我正在编写一个 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。
如前所述,我自己找到了一个可接受的解决方案,但尚未将其标记为我接受的答案,因为我不确定,这是一个很好的解决方案,而不是如果我需要分号时可能会咬我的 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。