421 Stimmen

Wie kann ich C++ 11 in CMake aktivieren?

Wenn ich versuche, ein von CMake generiertes Makefile auszuführen, um mein Programm zu kompilieren, erhalte ich den Fehler, dass

Bereichsbezogene for-Schleifen werden im C++ 98-Modus nicht unterstützt.

Ich habe versucht, Folgendes hinzuzufügen add_definitions(-std=c++0x) zu meinem CMakeLists.txt aber es hat nicht geholfen.

Das habe ich auch versucht:

if(CMAKE_COMPILER_IS_GNUCXX)
    add_definitions(-std=gnu++0x)
endif()

Wenn ich das tue g++ --version erhalte ich:

g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1

Ich habe auch versucht SET(CMAKE_CXX_FLAGS "-std=c++0x") was ebenfalls nicht funktioniert.

Ich verstehe nicht, wie ich die Funktionen von C++ 11 mit CMake aktivieren kann.

484voto

David Grayson Punkte 77766

CMake 3.1 führte die CMAKE_CXX_STANDARD Variable, die Sie verwenden können. Wenn Sie wissen, dass Sie immer CMake 3.1 oder höher zur Verfügung haben werden, können Sie dies einfach in Ihre CMakeLists.txt-Datei auf oberster Ebene schreiben oder es direkt vor die Definition eines neuen Ziels setzen:

set (CMAKE_CXX_STANDARD 11)

Wenn Sie ältere Versionen von CMake unterstützen müssen (was heutzutage eher unwahrscheinlich ist), finden Sie hier ein Makro, das ich entwickelt habe und das Sie verwenden können:

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)

Das Makro unterstützt im Moment nur GCC, aber es sollte einfach sein, es auf andere Compiler zu erweitern.

Dann könnten Sie schreiben use_cxx11() am Anfang jeder CMakeLists.txt-Datei, die ein Ziel definiert, das C++11 verwendet.

CMake-Problem #15943 für Clang-Benutzer, die macOS verwenden

Wenn Sie CMake und clang verwenden, um macOS zu zielen, gibt es eine Fehler die die Ursache für die CMAKE_CXX_STANDARD Funktion einfach nicht funktionieren (keine Compiler-Flags hinzufügen). Stellen Sie sicher, dass Sie eines der folgenden Dinge tun:

  • 使用方法 cmake_minimum_required um CMake 3.0 oder höher zu benötigen, oder

  • Setzen Sie die Richtlinie CMP0025 auf NEW mit folgendem Code am Anfang Ihrer CMakeLists.txt-Datei vor der project Befehl:

      # Fix behavior of CMAKE_CXX_STANDARD when targeting macOS.
      if (POLICY CMP0025)
        cmake_policy(SET CMP0025 NEW)
      endif ()

194voto

Erik Sjölund Punkte 9620

Der CMake-Befehl target_compile_features() wird verwendet, um das gewünschte C++-Merkmal anzugeben cxx_range_for . CMake veranlasst dann den zu verwendenden C++-Standard.

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)

Es besteht keine Notwendigkeit, die add_definitions(-std=c++11) oder um die CMake-Variable CMAKE_CXX_FLAGS Denn CMake sorgt dafür, dass der C++-Compiler mit den entsprechenden Kommandozeilen-Flags aufgerufen wird.

Vielleicht verwendet Ihr C++-Programm andere C++-Funktionen als cxx_range_for . Die globale CMake-Eigenschaft CMAKE_CXX_KNOWN_FEATURES listet die C++-Funktionen auf, aus denen Sie wählen können.

Anstelle der Verwendung von target_compile_features() können Sie den C++-Standard auch explizit angeben, indem Sie die CMake-Eigenschaften CXX_STANDARD und CXX_STANDARD_REQUIRED für Ihr CMake-Ziel.

Siehe auch meine ausführlichere Antwort .

92voto

KoKuToru Punkte 4047

Ich verwende

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()

Aber wenn Sie mit C++11 , g++ 4.6.1 ist ziemlich alt. Versuchen Sie, ein neueres g++ Version.

67voto

Luckyrand Punkte 729

Der einfachste Weg, den Cxx-Standard festzulegen, ist:

 set_property(TARGET tgt PROPERTY CXX_STANDARD 11)

参照 die CMake-Dokumentation をご覧ください。

46voto

MateuszL Punkte 2552

Auf modernen CMake (>= 3.1) ist der beste Weg, globale Anforderungen zu setzen:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

Das bedeutet: "Ich will C++11 für alle Ziele, es ist nicht optional, ich will keine GNU- oder Microsoft-Erweiterungen verwenden." Ab C++17 ist dies IMHO immer noch der beste Weg.

出典 Aktivieren von C++11 und später in CMake

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X