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.

5voto

Kevin Katzke Punkte 3203

Was bei mir funktioniert, ist, die folgende Zeile in die CMakeLists.txt zu schreiben:

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

Durch das Setzen dieses Befehls werden die C++11-Funktionen für den Compiler aktiviert und nach dem Ausführen der cmake .. sollten Sie in der Lage sein, mit dem Befehl range based for loops in Ihrem Code und kompilieren Sie ihn ohne Fehler.

5voto

codeling Punkte 10632

Für den Fall, dass Sie immer den neuesten C++-Standard aktivieren wollen, hier ist meine Erweiterung von David Grayson's Antwort in Anbetracht der kürzlich (CMake 3.8 und CMake 3.11) hinzugefügten Werte von 17 und 20 für CMAKE_CXX_STANDARD):

IF (CMAKE_VERSION VERSION_LESS "3.8")
    SET(CMAKE_CXX_STANDARD 14)
ELSEIF (CMAKE_VERSION VERSION_LESS "3.11")
    SET(CMAKE_CXX_STANDARD 17)
ELSE()
    SET(CMAKE_CXX_STANDARD 20)
ENDIF()

# Typically, you'll also want to turn off compiler-specific extensions:
SET(CMAKE_CXX_EXTENSIONS OFF)

(Verwenden Sie diesen Code anstelle von set (CMAKE_CXX_STANDARD 11) in der verlinkten Antwort).

2voto

Ehsan Panahi Punkte 100

Ich denke, diese beiden Zeilen sind ausreichend.

set(CMAKE_CXX_STANDARD 11)

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

2voto

SpacePotatoes Punkte 528

Der moderne Weg ist die Angabe der mindestens erforderlich Standard zu C++11 mit:

target_compile_features(foo PUBLIC cxx_std_11)

Hier entlang:

  • CMake kann den Standard-C++-Standard des Compilers berücksichtigen, wenn dieser größer als C++11 ist
  • Sie können eindeutig festlegen, ob der C++-Standard zur Erstellungszeit, zur Verbrauchszeit oder zu beiden Zeiten erforderlich ist. Das ist gut für Bibliotheken.
  • Öffentliche Kompilierfunktionen werden an nachgelagerte Ziele weitergegeben, so dass sie in diesen Zielen kostenlos zur Verfügung stehen, auch wenn sie diese Funktion nicht direkt verwenden.
  • Benutzer können von außen einen anderen C++-Standard (grundsätzlich neueren Datums) einstellen, mit CMAKE_CXX_STANDARD entweder über die Kommandozeile oder über CMake-Voreinstellungen. Wenn Sie Hardcode CMAKE_CXX_STANDARD in einer CMakeLists, kann niemand den C++-Standard außer Kraft setzen, ohne die CMakeLists zu bearbeiten, was nicht sehr angenehm ist.

Es erfordert CMake >= 3.8

2voto

Rolf Hausen Punkte 47

Für den Fall, dass Sie bei der Verwendung von cmake über denselben Fehler stolpern wie ich. Sie müssen Folgendes einstellen

set (CMAKE_CXX_STANDARD 11)

Threading zu aktivieren, da es erst ab C++11 ++ unterstützt wird

Ich hoffe, das hilft

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