2013-11-23 134 views
4

我想写一个CMakeFiles.txt(从来没有做过它),我不知道什么编译器标志用于C + + 11。我使用GCC 4.8.2和标志是std = C++ 0x,但我不知道该如何处理其他编译器。我不认为他们都使用该标志,我相信MinGW-TDM使用std = C++ 11,那么确保编译器使用C++ 11的正确方法是什么?C++编译器标志11

+2

GCC 4.8。*的正确标志是'-std = C++ 11'。至于其他编译器,你必须咨询他们的文档 - 没有通用的方法。 – Angew

+1

相关? http://stackoverflow.com/q/10851247/420683 – dyp

+0

嗯我一直在我的makefiles中使用-std = C++ 0x,它一直在工作。我会尝试该线程DyP中的建议,但我想我必须找到msvc和llvm的文档。多谢你们。 – Mike

回答

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每晚构建的FindCXXFeatures.cmake。

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

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() 

这样的实例。

+0

对于clang,你可能还需要'-stdlib = libC++' – 2013-12-16 17:29:08

0

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

例如,该C++的文件名的程序main.cc利用的C++特性: cxx_strong_enumscxx_constexprcxx_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版本中,所以我想,只有在您喜欢试验的情况下才能使用此功能。

0
set_property(TARGET your_target PROPERTY CXX_STANDARD 11)