20

I'm trying to run C++11 code in CLion but it doesn't work. It says:

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

I tried to set CMAKE_C_FLAGS to -std=c++11 or -std=gnu++11 but I still have the same problem. Regular C++ code compiles fine.

What flag do I have to set in CLion's CMake window to compile my C++11 code?

PierreBdR
  • 42,120
  • 10
  • 46
  • 62
Pavel
  • 4,912
  • 7
  • 49
  • 69

2 Answers2

27

I tried to set CMAKE_C_FLAGS

According to the documentation the CMAKE_C_FLAGS set C language flags for all build types. For C++ you need use CMAKE_CXX_FLAGS instead:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
Gluttton
  • 5,739
  • 3
  • 31
  • 58
  • Where are the variables `CMAKE_CXX_FLAGS` set? I'm not too familiar with CMake. – hlin117 Jan 10 '15 at 16:56
  • @hlin117, 'CMAKE_CXX_FLAGS' is situated in file 'CMakeLists'. – Gluttton Jan 10 '15 at 17:08
  • I noticed how unclear my question was after I posted it, sorry. I meant to ask, in the line `set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")`, the second `CMAKE_CXX_FLAGS` has to be initialized before it's referenced (using `$`), but where is it initialized? (I can't imagine that the variable is both initialized and referenced on the same line.) – hlin117 Jan 10 '15 at 17:12
  • 1
    @hlin117, short answer is you shouldn't worry about previous initialisation or declaration such variables. If variable is existed it will be used, if not then empty string will be substituted. In generally this form of declaration allow change value of existing variable instead of rewriting. – Gluttton Jan 10 '15 at 17:32
  • To enable C++14 I tried `-std=c++14`, but it doesn't work. Any ideas? – a06e Jul 24 '15 at 20:34
  • @becko, What compiler do you use and what version? – Gluttton Jul 24 '15 at 20:39
  • @becko, It's looks like 4.8.4 not support C++14 (I can't prove this assumption), but you can try use experimental implementation by adding `-std=c++y` instead. – Gluttton Jul 24 '15 at 20:48
  • Try -std=c++1y (not just y) for compilers with early C++14 support. – U007D Aug 29 '16 at 20:48
12

For CMake 3.1 or later, you can set the CMAKE_CXX_STANDARD variable to 11:

Default value for CXX_STANDARD property of targets.

This variable is used to initialize the CXX_STANDARD property on all targets.

CXX_STANDARD documentation:

The C++ standard whose features are requested to build this target.

This property specifies the C++ standard whose features are requested to build this target. For some compilers, this results in adding a flag such as -std=gnu++11 to the compile line.

Supported values are 98, 11 and 14.

If the value requested does not result in a compile flag being added for the compiler in use, a previous standard flag will be added instead. This means that using:

set_property(TARGET tgt PROPERTY CXX_STANDARD 11)

with a compiler which does not support -std=gnu++11 or an equivalent flag will not result in an error or warning, but will instead add the -std=gnu++98 flag if supported. This “decay” behavior may be controlled with the CXX_STANDARD_REQUIRED target property.

See the cmake-compile-features(7) manual for information on compile features.

This property is initialized by the value of the CMAKE_CXX_STANDARD variable if it is set when a target is created.

Community
  • 1
  • 1
Casey
  • 41,449
  • 7
  • 95
  • 125
  • 10
    What if I want `-std=c++11` and not `-std=gnu++11`, how does `CXX_STANDARD 11` differentiate between the two? – Ela782 Nov 03 '15 at 21:08