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.

45voto

eyelash Punkte 2600

Für CMake 3.8 und neuer können Sie verwenden

target_compile_features(target PUBLIC cxx_std_11)

Wenn Sie möchten, dass der Generierungsschritt fehlschlägt, wenn die Toolchain diesen Standard nicht einhalten kann, können Sie dies zur Bedingung machen.

set_target_properties(target PROPERTIES CXX_STANDARD_REQUIRED ON)

Wenn Sie sich strikt an den C++-Standard halten wollen, d.h. die von Ihrem Compiler angebotenen C++-Erweiterungen (wie z.B. GCCs -std=gnu++17 ), zusätzlich setzen

set_target_properties(target PROPERTIES CXX_EXTENSIONS OFF)

Dies ist im Detail dokumentiert unter Eine Einführung in modernes CMake -> Hinzufügen von Funktionen -> C++11 und darüber hinaus. Es bietet auch Ratschläge, wie man dies auf älteren Versionen von CMake zu erreichen, wenn Sie auf diese beschränkt sind.

40voto

Subhamoy S. Punkte 6416

Wie sich herausstellte, SET(CMAKE_CXX_FLAGS "-std=c++0x") aktiviert viele C++11-Funktionen. Der Grund, warum es nicht funktionierte, war, dass die Anweisung wie folgt aussah:

set(CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")

Diesem Ansatz folgend, wird die -std=c++0x überschrieben wurde und nicht funktioniert hat. Die Flaggen einzeln zu setzen oder eine Listenmethode zu verwenden, funktioniert.

list( APPEND CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")

18voto

alvarez Punkte 680

Der einfachste Weg:

add_compile_options(-std=c++11)

14voto

Hindol Punkte 2758

Dies ist eine weitere Möglichkeit, die C++11-Unterstützung zu aktivieren,

ADD_DEFINITIONS(
    -std=c++11 # Or -std=c++0x
    # Other flags
)

Ich habe Fälle erlebt, in denen nur diese Methode funktioniert und andere Methoden fehlschlagen. Vielleicht hat es etwas mit der neuesten Version von CMake zu tun.

6voto

RAM Punkte 2025

Das moderne cmake bietet einfachere Möglichkeiten, Compiler so zu konfigurieren, dass sie eine bestimmte Version von C++ verwenden. Das Einzige, was man tun muss, ist, die entsprechenden Zieleigenschaften zu setzen. Unter den von cmake unterstützte Eigenschaften Die folgenden werden verwendet, um zu bestimmen, wie Compiler konfiguriert werden müssen, um eine bestimmte C++-Version zu unterstützen:

  • CXX_STANDARD legt den C++-Standard fest, dessen Merkmale zur Erstellung des Ziels angefordert werden. Setzen Sie dies als 11 um C++11 zu erreichen.

  • CXX_EXTENSIONS ein boolescher Wert, der angibt, ob compilerspezifische Erweiterungen angefordert werden. Wenn Sie dies als Off deaktiviert die Unterstützung für alle compilerspezifischen Erweiterungen.

Zur Veranschaulichung ist hier ein minimales Arbeitsbeispiel für eine CMakeLists.txt .

cmake_minimum_required(VERSION 3.1)

project(testproject LANGUAGES CXX )

set(testproject_SOURCES
    main.c++
    )

add_executable(testproject ${testproject_SOURCES})

set_target_properties(testproject
    PROPERTIES
    CXX_STANDARD 11
    CXX_EXTENSIONS off
    )

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