Когда я пытаюсь запустить созданный CMake make-файл для компиляции моей программы, я получаю сообщение об ошибке
Диапазон, основанный на циклах, не поддерживается в режиме C ++ 98.
Я пытался добавить add_definitions(-std=c++0x)
в мой CMakeLists.txt
, но это не помогло.
Я тоже это попробовал:
if(CMAKE_COMPILER_IS_GNUCXX)
add_definitions(-std=gnu++0x)
endif()
Когда я делаю g++ --version
, я получаю:
g ++ (Ubuntu / Linaro 4.6.1-9ubuntu3) 4.6.1
Я тоже попробовал SET(CMAKE_CXX_FLAGS "-std=c++0x")
, что тоже не работает.
Я не понимаю, как я могу активировать функции C ++ 11 с помощью CMake.
SET(CMAKE_CXX_FLAGS "-std=c++0x")
меня отлично работает, так что, возможно, проблема где-то еще в файле CMakeLists. Убедитесь, что вы случайно не перезаписали содержимое CMAKE_CXX_FLAGS позже.set(CMAKE_CXX_STANDARD 11)
(перед определением цели) это лучший способ.CXX_STANDARD
это не работает на MSVC, так что в основном вы должны отступить,target_compile_features
если вы хотите что-то, что работает кроссплатформенно.Ответы:
CMake 3.1 представил переменную CMAKE_CXX_STANDARD, которую вы можете использовать. Если вы знаете, что у вас всегда будет доступен CMake 3.1, вы можете просто написать это в своем файле CMakeLists.txt верхнего уровня или поместить его прямо перед тем, как будет определена любая новая цель:
Если вам нужно поддерживать более старые версии CMake, вот макрос, который я придумал, который вы можете использовать:
Макрос поддерживает только GCC прямо сейчас, но он должен быть прост, чтобы распространить его на другие компиляторы.
Затем вы можете написать
use_cxx11()
в верхней части любого файла CMakeLists.txt, который определяет цель, которая использует C ++ 11.CMake выпуск № 15943 для пользователей clang, ориентированных на macOS
Если вы используете CMake и clang для нацеливания на macOS, существует ошибка, которая может привести к тому, что эта
CMAKE_CXX_STANDARD
функция просто не будет работать (не добавлять какие-либо флаги компилятора). Убедитесь, что вы делаете одну из следующих вещей:Установите для политики CMP0025 значение NEW с помощью следующего кода в верхней части файла CMakeLists.txt перед
project
командой:источник
gnu++11
он применяется, даже когда эти переменные определеныset(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang)
set(CMAKE_ANDROID_STL_TYPE c++_static)
. Для меня единственным жизнеспособным выходом был классическийset (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
Команда CMake
target_compile_features()
используется для указания требуемой функции C ++cxx_range_for
. Затем CMake индуцирует использование стандарта C ++.Нет необходимости использовать
add_definitions(-std=c++11)
или изменять переменную CMakeCMAKE_CXX_FLAGS
, потому что CMake будет следить за тем, чтобы компилятор C ++ вызывался с соответствующими флагами командной строки.Возможно, ваша программа на C ++ использует другие функции, кроме C ++
cxx_range_for
. Глобальное свойство CMakeCMAKE_CXX_KNOWN_FEATURES
содержит список функций C ++, которые вы можете выбрать.Вместо использования
target_compile_features()
вы также можете явно указать стандарт C ++, установив свойства CMakeCXX_STANDARD
иCXX_STANDARD_REQUIRED
для вашей цели CMake.Смотрите также мой более подробный ответ .
источник
я использую
Но если вы хотите поиграть
C++11
,g++ 4.6.1
довольно старый. Попробуйте получить более новуюg++
версию.источник
CXX_STANDARD
ответов на основе, но это был единственный ответ, полезный в моей ситуации.Самый простой способ установить стандарт Cxx:
Смотрите документацию CMake для более подробной информации.
источник
set(CMAKE_CXX_STANDARD 11)
определить свойство по умолчанию для всех целей, созданных после этого.set
команда, предложенная @emlai, является глобальной и влияет на все последующие цели.Оказывается,
SET(CMAKE_CXX_FLAGS "-std=c++0x")
активирует многие функции C ++ 11. Причина, по которой это не сработало, заключалась в том, что заявление выглядело так:Следуя такому подходу,
-std=c++0x
флаг как-то был перезаписан, и он не работал. Установка флагов одна за другой или использование метода списка работает.источник
CXX_STANDARD
Свойство лучше , так как это компилятор агностик.Самый простой способ:
add_compile_options(-std=c++11)
источник
Для CMake 3.8 и новее вы можете использовать
источник
PUBLIC
здесь?PUBLIC
означает, что другие цели, которые зависят от вашей цели, также будут использовать C ++ 11. Например, если ваша цель - библиотека, все цели, которые ссылаются на вашу библиотеку,target_link_libraries
будут скомпилированы с поддержкой C ++ 11.Это еще один способ включить поддержку C ++ 11,
Я встречал случаи, когда только этот метод работает, а другие методы не работают. Возможно, это как-то связано с последней версией CMake.
источник
add_definitions
Предполагается, что используется только для добавления определений, то есть -D ЧТО-ТО. И, как сказал @Emmanuel, во многих случаях это не работает.add_definitions
не был сделан для установки флагов.На современном CMake (> = 3.1) лучший способ установить глобальные требования:
Это означает: «Я хочу C ++ 11 для всех целей, это не обязательно, я не хочу использовать какие-либо расширения GNU или Microsoft». Начиная с C ++ 17, это ИМХО лучший способ.
Источник: Включение C ++ 11 и позже в CMake
источник
Что работает для меня, это установить следующую строку в вашем CMakeLists.txt:
Установка этой команды активирует функции C ++ 11 для компилятора, и после выполнения
cmake ..
команды вы сможете использовать ееrange based for loops
в своем коде и скомпилировать его без каких-либо ошибок.источник
-std=c++11
, так какset (CMAKE_CXX_STANDARD 11)
будет использовать флаг-std=gnu++11
, который может быть нежелательным.set (CMAKE_CXX_EXTENSIONS OFF)
Я думаю, что только этих двух строк достаточно.
источник
target_compile_features
функция Cmake , применяемая для каждой отдельной цели, как показано в других ответах, является более рекомендуемым подходом.Если вы хотите всегда активировать последний стандарт C ++, вот мое расширение ответа Дэвида Грейсона в свете недавних (CMake 3.8 и CMake 3.11) добавлений значений 17 и 20 для CMAKE_CXX_STANDARD):
(Используйте этот код вместо
set (CMAKE_CXX_STANDARD 11)
связанного ответа.)источник
Современный cmake предлагает более простые способы настройки компиляторов для использования конкретной версии C ++. Единственное, что нужно сделать, это установить соответствующие целевые свойства. Среди свойств, поддерживаемых cmake , есть те, которые используются для определения того, как настроить компиляторы для поддержки конкретной версии C ++:
CXX_STANDARD
устанавливает стандарт C ++, функции которого запрашиваются для создания цели. Установите это как11
цель C ++ 11.CXX_EXTENSIONS
, логическое значение, указывающее, запрашиваются ли специфичные для компилятора расширения. Установка этого параметраOff
отключает поддержку любого конкретного расширения компилятора.Чтобы продемонстрировать, вот минимальный рабочий пример
CMakeLists.txt
.источник
OS X и Homebrew LLVM связаны с:
Не забудьте вызвать cmake_minimum_required (VERSION 3.3) и project () после него!
Или CMake вставит
project()
неявно перед строкой 1, вызывая проблемы с обнаружением версии Clang и, возможно, другие виды проблем. Вот связанная проблема .источник