首页 > 解决方案 > 如何在 cmake 中通过 g++ 编译器查找默认支持的 C++ 标准

问题描述

我看到了很多关于如何启用某些 C++ 标准的线程,例如

add_definitions("-std=c++14")

set (CMAKE_CXX_STANDARD 11)

但是如何在编译代码时找到默认的 g++ 编译器遵循哪个标准?

标签: c++ubuntucmake

解决方案


如果您正在开发应用程序,则不应根据可用的编译器版本调整代码,而应指定代码所需的编译器标准:

set (CMAKE_CXX_STANDARD 11)

如果您正在构建一个旨在用于不同上下文的代码库,请使用编译器功能检测和条件编译。例如:

write_compiler_detection_header(
  FILE "${CMAKE_CURRENT_BINARY_DIR}/compiler_features.h"
  PREFIX Foo
  COMPILERS GNU
  FEATURES
    cxx_variadic_templates
)

接着:

#include "compiler_features.h"
#if Foo_COMPILER_CXX_VARIADIC_TEMPLATES
#  include "with_variadics/interface.h"
#else
#  include "no_variadics/interface.h"
#endif

这对于像 MSVC 这样的编译器特别有用,它们具有 C++17 的许多特性,同时也缺乏 C++11 的一些基本特性(例如表达式 SFINAE)。

CMake为许多流行的 C++ 功能内置了检测器。


PS。如果你真的很好奇,G++ 到 5.0 默认使用gnu++98标准,从 6.0 开始gnu++14(GNU 方言 -std=c++14)。


推荐阅读