cmake 如何在 C++ 中将编译器标志附加到末尾

4 c++ standards cmake compiler-flags

我想将编译器 C++ 标准设置为 gnu++17 但我不能这样做,CMAKE_CXX_STANDARD因为它给我的gnu++17是无效值。因此我把它放在CMAKE_CXX_FLAGS. 但是当我编译 cmakestd=gnu++11时,会像这样附加到命令的末尾:-

/bin/g++ -Wall -Wpedantic -Wextra -std=gnu++14 -no-pie   -fPIC -std=gnu++11 -o /path/to/main.cpp.o -c /blah/blahfeeelk
Run Code Online (Sandbox Code Playgroud)

从而std=gnu++11获胜。所以想追gnu++17加到最后。我怎样才能做到这一点 ?(我已经修剪了原始命令)

bes*_*esc 5

CMake 有三个变量来控制 C++ 标准的版本和打开/关闭编译器扩展。我在这里展示了目标特定版本,因为这是在相当现代的 (v3.x) CMake 中使用它的方式。

add_executable(foo main.cpp)
set_target_properties(foo PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED ON
    CXX_EXTENSIONS ON
)
Run Code Online (Sandbox Code Playgroud)

这将启用 C++17,防止在 17 不可用时自动回退到较早的标准,并启用编译器扩展。对于 GCC,这相当于-std=gnu++17-std=gnu++1z

17自 CMake 3.8 起,带有该值的CXX_STANDARD可用。CXX_STANDARD_REQUIREDCXX_EXTENSIONS从 CMake 3.1开始存在。

  • 这仅适用于 cmake 白名单的 std 版本。它不适用于 c++2a。一个解决方案会很好(因为在我的例子中,有些东西不断添加 `-std=gnu++11` 标志) (2认同)