【发布时间】:2020-08-09 11:50:09
【问题描述】:
我正在尝试在 CMake 项目中启用警告。使用类似于this answer 中建议的target_compile_options 可以正常工作:
target_compile_options(mytarget PRIVATE $<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra -pedantic>)
我有很多目标,我想将这些设置应用于所有目标。所以,我尝试改用add_compile_options:
add_compile_options($<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra -pedantic>)
但是,当我使用它时,我看到编译器传递了"\$<1:-Wall" -Wextra "-pedantic>",好像在扩展生成器表达式之前发生了空间分割。这会使编译器感到困惑并且构建失败。
我尝试将参数引用到add_compile_commands:
add_compile_options("$<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra -pedantic>")
但是当我这样做时,编译器会被传递一个 "-Wall -Wextra -pedantic" 参数,这也会混淆它并导致构建失败。
我可以像这样“分发”生成器表达式:
add_compile_options(
$<$<CXX_COMPILER_ID:GNU,Clang>:-Wall>
$<$<CXX_COMPILER_ID:GNU,Clang>:-Wextra>
$<$<CXX_COMPILER_ID:GNU,Clang>:-pedantic>
)
这很好用,解决了我眼前的问题……
...但是,问题仍然存在:是什么导致add_compile_options 与target_compile_options 的工作方式不同?他们的字符串拆分语义不应该相同吗?
【问题讨论】:
标签: cmake