2014-10-11 657 views
9

我想在CLion中运行C++ 11代码,但它不起作用。它说:如何在CLion中启用C++ 11?

... 
    /projects/CLion/untitled/main.cpp:7:1: note: C++11 ‘constexpr’ only available with -std=c++11 or -std=gnu++11 
... 

我试图设置CMAKE_C_FLAGS-std=c++11-std=gnu++11,但我仍然有同样的问题。普通的C++代码编译得很好。

我必须在CLion的CMake窗口中设置什么标志来编译我的C++ 11代码?

回答

17

我试图设置CMAKE_C_FLAGS

按照documentationCMAKE_C_FLAGS组C语言标志所有build types。对于C++,你需要使用CMAKE_CXX_FLAGS代替:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
+0

变量'CMAKE_CXX_FLAGS'设置在哪里?我不太熟悉CMake。 – hlin117 2015-01-10 16:56:56

+0

@ hlin117,'CMAKE_CXX_FLAGS'位于'CMakeLists'文件中。 – Gluttton 2015-01-10 17:08:02

+0

我注意到我的问题发布后我的不清楚,对不起。我打算在'set(CMAKE_CXX_FLAGS“$ {CMAKE_CXX_FLAGS} -std = C++ 11”)行中提问,第二个'CMAKE_CXX_FLAGS'必须在被引用之前初始化(使用''''),但是在哪里它已初始化?(我无法想象这个变量是同时被初始化和引用的。) – hlin117 2015-01-10 17:12:19

9

对于CMake的3.1或更高版本,可以set the CMAKE_CXX_STANDARD variable11

默认值CXX_STANDARD的目标财产。

此变量用于初始化所有目标上的CXX_STANDARD属性。

CXX_STANDARD documentation

C++标准,其特征请求建立这个目标。

此属性指定要求构建此目标的功能的C++标准。对于某些编译器,这会导致在编译行中添加一个标志,例如-std=gnu++11

支持的值是98,11和14

如果添加用于在使用编译器请求不会导致编译标志的值,先前标准标志将被代替加入。这意味着使用:

set_property(TARGET tgt PROPERTY CXX_STANDARD 11) 

与编译器不支持-std=gnu++11或等效的标志不会导致错误或警告,但如果支持的话反而会添加-std=gnu++98标志。这种“衰减”行为可以通过CXX_STANDARD_REQUIRED目标属性进行控制。

有关编译功能的信息,请参阅cmake-compile-features(7)手册。

如果在创建目标时设置此属性,则该属性将由CMAKE_CXX_STANDARD变量的值初始化。

+4

如果我想要'-std = C++ 11'而不是'-std = gnu ++ 11',那么'CXX_STANDARD 11'如何区分两者呢? – Ela782 2015-11-03 21:08:33