2014-10-11 4 views
9

Я пытаюсь запустить код C++ 11 в CLion, но он не работает. Он говорит:Как включить C++ 11 в CLion?

... 
    /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++ отлично компилируется.

Какой флаг мне нужно установить в окне CMake CLION для компиляции моего кода на C++ 11?

ответ

17

Я попытался установить CMAKE_C_FLAGS

По documentation флагов языка C CMAKE_C_FLAGS набор для всех build types. Для C++ вам нужно использовать CMAKE_CXX_FLAGS вместо:

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

Где находятся переменные 'CMAKE_CXX_FLAGS'? Я не слишком хорошо знаком с CMake. – hlin117

+0

@ hlin117, 'CMAKE_CXX_FLAGS' находится в файле 'CMakeLists'. – Gluttton

+0

Я заметил, как неясно, как мой вопрос был после того, как я опубликовал его, извините. Я хотел спросить, в строке 'set (CMAKE_CXX_FLAGS) $ {CMAKE_CXX_FLAGS} -std = C++ 11") ', второй' CMAKE_CXX_FLAGS' должен быть инициализирован до того, как он будет указан (используя '$'), но где он инициализирован?(Я не могу себе представить, что переменная инициализирована и указана в той же строке.) – hlin117

9

Для CMake 3.1 или более поздней версии, вы можете set the CMAKE_CXX_STANDARD variable к 11:

Значение по умолчанию для 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

Смежные вопросы