C ++ 11的编译器标志

时间:2013-11-23 19:14:39

标签: c++11 cmake

我正在尝试编写一个CMakeFiles.txt(以前从未这样做过),我不确定用于C ++ 11的编译器标志是什么。我使用GCC 4.8.2,标志是std = c ++ 0x,但我不知道如何处理其他编译器。我不认为他们都使用那个标志,我相信MinGW-TDM使用std = c ++ 11,确保编译器使用c ++ 11的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

在我的项目中,我只是尝试添加-std = c ++ 11,如果这不起作用,我尝试-std = c ++ 0x。当两者都失败时,我就不管它了。对我来说效果很好,但我从来没有尝试过Windows编译器。 这是一个示例代码:

# test for C++11 flags
include(TestCXXAcceptsFlag)

if(NOT DISABLE_GXX0XCHECK)
  # try to use compiler flag -std=c++11
  check_cxx_accepts_flag("-std=c++11" CXX_FLAG_CXX11)
endif(NOT DISABLE_GXX0XCHECK)

if(CXX_FLAG_CXX11)
  [add flag -std=c++11 where needed]
else()
  if(NOT DISABLE_GXX0XCHECK)
    # try to use compiler flag -std=c++0x for older compilers
    check_cxx_accepts_flag("-std=c++0x" CXX_FLAG_CXX0X)
  endif(NOT DISABLE_GXX0XCHECK)
  if(CXX_FLAG_CXX0X)
    [add flag -std=c++11 where needed]
...

Mabye stackoverflow.com/q/10984442也对你有帮助。 ErikSjölund建议看一下CMake nightly build的FindCXXFeatures.cmake。

编辑:我尝试使用Microsoft的Visual C ++,我的解决方案有一个缺陷:编译器发出有关无法识别的标志的警告。这意味着CMake将标志检测为正确并添加它。因此,每个可执行文件都会收到此警告。添加-Werror或Visual C ++的标志应该有所帮助。

答案 1 :(得分:1)

您需要为您要定位的每个编译器手动设置标记:

IF (CMAKE_COMPILER_IS_GNUCXX)
  SET (CMAKE_CXX_FLAGS "-std=gnu++11")
ELSEIF (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  SET (CMAKE_CXX_FLAGS "-std=c++11")
ELSEIF (MSVC)
  # On by default
ENDIF ()

例如。

答案 2 :(得分:0)

随着即将发布的CMake版本3.1.0(现在作为候选版本2发布),新方法是使用CMake命令target_compile_features来指定正在使用的C++ features。 CMake将从此信息中确保使用正确的命令行标志调用C ++编译器(例如 -std = c ++ 11 )。

例如,这个文件名为 main.cc 的C ++程序使用了C ++特性: cxx_strong_enums cxx_constexpr cxx_auto_type

#include <cstdlib>

int main(int argc, char *argv[]) {
  enum class Color { Red, Orange, Yellow, Green, Blue, Violet };
  constexpr float a = 3.1415f;
  auto b = a;
  return EXIT_SUCCESS;
}

此CMakeLists.txt文件将构建它

cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
add_executable(foobar main.cc)                                                                                                                                                                                                                                                     
set(needed_features
    cxx_strong_enums
    cxx_constexpr
    cxx_auto_type)
target_compile_features(foobar PRIVATE ${needed_features})

截至今天(2014年11月21日),CMake 3.1.0版尚未发布。它现在可用作候选版本2。 请注意,此功能尚未在稳定的CMake版本中发布,因此我想,只有在您想要进行实验时才使用此功能。

答案 3 :(得分:0)

set_property(TARGET your_target PROPERTY CXX_STANDARD 11)