Как активировать C++ 11 в CMake?
когда я пытаюсь запустить CMake сгенерированный makefile для компиляции моей программы, я получаю ошибку, что
диапазон, основанный на циклах, не поддерживается в режиме 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.
12 ответов:
CMake 3.1 представил CMAKE_CXX_STANDARD переменная, которую вы можете использовать. Если вы знаете, что у вас всегда будет доступен CMake 3.1, вы можете просто написать это в своих списках CMakeLists верхнего уровня.txt файл, или положите его прямо перед любой новой цели определяется:
set (CMAKE_CXX_STANDARD 11)Если вам нужно поддерживать более старые версии CMake, вот макрос, который я придумал, который вы можете использовать:
macro(use_cxx11) if (CMAKE_VERSION VERSION_LESS "3.1") if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") endif () else () set (CMAKE_CXX_STANDARD 11) endif () endmacro(use_cxx11)макрос поддерживает только GCC прямо сейчас, но он должен быть прямолинейным разверните его для других компиляторов.
затем вы могли бы написать
use_cxx11()в верхней части любого CMakeLists.txt-файл, который определяет цель, использующую C++11.проблема CMake #15943 для пользователей clang, ориентированных на macOS
если вы используете CMake и clang для целевой MacOS есть ошибка это может вызвать
CMAKE_CXX_STANDARDфункция просто не работает (не добавлять флаги компилятора). Убедитесь, что вы делаете одно из следующих действий:
- использовать cmake_minimum_required чтобы потребовать CMake 3.0 или более поздней версии, или
установите политику CMP0025 в NEW с помощью следующего кода в верхней части списка CMakeLists.txt файл перед
projectкоманда:# Fix behavior of CMAKE_CXX_STANDARD when targeting macOS. if (POLICY CMP0025) cmake_policy(SET CMP0025 NEW) endif ()
команда CMake
target_compile_features()используется для указания необходимой функции C++cxx_range_for. Затем CMake побудит использовать стандарт C++.cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR) project(foobar CXX) add_executable(foobar main.cc) target_compile_features(foobar PRIVATE cxx_range_for)нет необходимости использовать
add_definitions(-std=c++11)или изменить переменную CMakeCMAKE_CXX_FLAGS, потому что CMake будет убедиться, что компилятор C++ вызывается с соответствующими флагами командной строки.возможно, ваша программа на C++ использует другой C++ особенности, чем
cxx_range_for. В случае с CMake глобальной собственностьCMAKE_CXX_KNOWN_FEATURESсписок функций C++, которые вы можете выбрать.вместо
target_compile_features()вы также можете явно указать стандарт C++, задав свойства CMakeCXX_STANDARDиCXX_STANDARD_REQUIREDдля вашей цели CMake.см. также мой более подробный ответ.
Я использую
include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") else() message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif()но если вы хотите играть с
C++11,g++ 4.6.1довольно старый. Попробуйте получить новыйg++версия.
самый простой способ установить стандарт Cxx:
set_property(TARGET tgt PROPERTY CXX_STANDARD 11)посмотреть документация CMake для более подробной информации.
как выясняется,
SET(CMAKE_CXX_FLAGS "-std=c++0x")активирует многие функции C++11. Причина, по которой это не сработало, заключалась в том, что заявление выглядело так:set(CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")следуя этому подходу, как-то
-std=c++0xфлаг был перезаписан, и это не сработало. Установка флагов по одному или с помощью метода list работает.list( APPEND CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")
Это еще один способ включения поддержки C++11,
ADD_DEFINITIONS( -std=c++11 # Or -std=c++0x # Other flags )Я встречал случаи, когда только этот метод работает, а другие методы не срабатывают. Возможно, это как-то связано с последней версией CMake.
что работает для меня, чтобы установить следующую строку в файл CMakeLists.txt:
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")установка этой команды активирует функции C++11 для компилятора и после выполнения
cmake ..команда, вы должны быть в состоянии использоватьrange based for loopsв коде и скомпилировать его без ошибок.
Я думаю, что только эти две строки достаточно.
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
на современном CMake (>=3.1) лучший способ установить глобальное требование:
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF)это переводится как "я хочу C++11 для всех целей, это необязательно, я не хочу использовать любой дистрибутив GNU или МС расширения." По состоянию на c++17, это все еще ИМХО лучший способ.
источник: https://crascit.com/2015/03/28/enabling-cxx11-in-cmake/
OS X и Homebrew LLVM связанные:
Не забудьте вызвать cmake_minimum_required (версия 3.3) и project () после него!
или CMake вставит
project()неявно перед строкой 1, вызывая проблемы с обнаружением версии Clang и, возможно, другими видами проблем. Вот это вопрос.
Comments