2014-10-11 39 views
9

Próbuję uruchomić kod C++ 11 w CLion, ale to nie działa. Mówi:Jak włączyć C++ 11 w CLion?

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

Próbowałem ustawić CMAKE_C_FLAGS do -std=c++11 lub -std=gnu++11 ale nadal mam ten sam problem. Regularny kod C++ świetnie się komplikuje.

Jaką flagę muszę ustawić w oknie CMake CLion, aby skompilować mój kod C++ 11?

Odpowiedz

17

Próbowałem ustawić CMAKE_C_FLAGS

Według documentation na CMAKE_C_FLAGS ustawionych flag C językowych dla wszystkich build types. Dla C++ trzeba użyć CMAKE_CXX_FLAGS zamiast:

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

Gdzie są ustawione zmienne "CMAKE_CXX_FLAGS"? Nie jestem zbyt obeznany z CMake. – hlin117

+0

@ hlin117, "CMAKE_CXX_FLAGS" znajduje się w pliku "CMakeLists". – Gluttton

+0

Zauważyłem, jak niejasne było moje pytanie po tym, jak je opublikowałem, przepraszam. Chciałem zapytać, w linii 'set (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -std = C++ 11 ")', drugi 'CMAKE_CXX_FLAGS' musi być zainicjalizowany przed odwołaniem (używając' $ '), ale gdzie jest to zainicjowano?(Nie mogę sobie wyobrazić, że zmienna jest zarówno inicjowana, jak i przywoływana w tym samym wierszu). – hlin117

9

dla CMake 3.1 lub nowszy, można set the CMAKE_CXX_STANDARD variable do 11:

Wartość domyślna dla CXX_STANDARD własnością celów.

Ta zmienna służy do inicjowania właściwości CXX_STANDARD we wszystkich obiektach docelowych.

CXX_STANDARD documentation:

standardem C++, którego cechy są wymagane, aby zbudować ten cel.

Ta właściwość określa standard C++, którego funkcje są wymagane do zbudowania tego obiektu docelowego. W przypadku niektórych kompilatorów powoduje to dodanie do linii kompilacji flagi, takiej jak -std=gnu++11.

Obsługiwane wartości to 98, 11 i 14.

Jeżeli wniosek nie powoduje flagi kompilacji wartość dodawana do kompilatora w użyciu, poprzednia norma flag zostanie dodana zamiast. Oznacza to, że za pomocą:

set_property(TARGET tgt PROPERTY CXX_STANDARD 11) 

z kompilatora, który nie obsługuje -std=gnu++11 lub równoważny flag nie spowoduje błędu lub ostrzeżenia, ale zamiast tego dodać flagę -std=gnu++98 jeśli obsługiwane. To zachowanie "zaniku" może być kontrolowane za pomocą właściwości docelowej CXX_STANDARD_REQUIRED.

Zobacz instrukcję cmake-compile-features(7), aby uzyskać informacje na temat funkcji kompilacji.

Ta właściwość jest inicjalizowana przez wartość zmiennej CMAKE_CXX_STANDARD, jeśli jest ustawiona podczas tworzenia celu.

+4

Co jeśli chcę '-std = C++ 11', a nie' -std = gnu ++ 11', w jaki sposób 'CXX_STANDARD 11' rozróżnia te dwa? – Ela782