Wenn ich versuche, ein von CMake generiertes Makefile auszuführen, um mein Programm zu kompilieren, wird der Fehler angezeigt
Für Schleifen basierende Bereiche werden im C ++ 98-Modus nicht unterstützt.
Ich habe versucht add_definitions(-std=c++0x)
, meine zu ergänzen CMakeLists.txt
, aber es hat nicht geholfen.
Ich habe es auch versucht:
if(CMAKE_COMPILER_IS_GNUCXX)
add_definitions(-std=gnu++0x)
endif()
Wenn ich das tue g++ --version
, bekomme ich:
g ++ (Ubuntu / Linaro 4.6.1-9ubuntu3) 4.6.1
Ich habe es auch versucht SET(CMAKE_CXX_FLAGS "-std=c++0x")
, was auch nicht funktioniert.
Ich verstehe nicht, wie ich C ++ 11-Funktionen mit CMake aktivieren kann.
SET(CMAKE_CXX_FLAGS "-std=c++0x")
funktioniert gut für mich, daher gibt es wahrscheinlich irgendwo anders ein Problem in der CMakeLists-Datei. Stellen Sie sicher, dass Sie den Inhalt von CMAKE_CXX_FLAGS später nicht versehentlich überschreiben.set(CMAKE_CXX_STANDARD 11)
(vor dem Definieren des Ziels) ist der beste Weg.CXX_STANDARD
dies unter MSVC nicht funktioniert. Sie müssen also grundsätzlich darauf zurückgreifen,target_compile_features
wenn Sie etwas möchten, das plattformübergreifend funktioniert.Antworten:
CMake 3.1 hat die Variable CMAKE_CXX_STANDARD eingeführt, die Sie verwenden können. Wenn Sie wissen, dass CMake 3.1 immer verfügbar ist, können Sie dies einfach in Ihre CMakeLists.txt-Datei der obersten Ebene schreiben oder direkt vor dem Definieren eines neuen Ziels einfügen:
Wenn Sie ältere Versionen von CMake unterstützen müssen, finden Sie hier ein Makro, das Sie verwenden können:
Das Makro unterstützt derzeit nur GCC, es sollte jedoch unkompliziert sein, es auf andere Compiler auszudehnen.
Dann können Sie
use_cxx11()
oben in jede CMakeLists.txt-Datei schreiben , die ein Ziel definiert, das C ++ 11 verwendet.CMake-Problem Nr. 15943 für Clang-Benutzer, die auf macOS abzielen
Wenn Sie CMake verwenden und auf macOS klicken, gibt es einen Fehler , der dazu führen kann, dass die
CMAKE_CXX_STANDARD
Funktion einfach nicht funktioniert (keine Compiler-Flags hinzufügen). Stellen Sie sicher, dass Sie eines der folgenden Dinge tun:Setzen Sie die Richtlinie CMP0025 mit dem folgenden Code oben in Ihrer CMakeLists.txt-Datei vor dem
project
Befehl auf NEW.quelle
gnu++11
erzwungen wird, selbst wenn diese Variablen definiert sindset(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang)
set(CMAKE_ANDROID_STL_TYPE c++_static)
. Für mich war der einzige Weg der Klassikerset (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
Mit dem Befehl CMake
target_compile_features()
wird die erforderliche C ++ - Funktion angegebencxx_range_for
. CMake veranlasst dann die Verwendung des C ++ - Standards.add_definitions(-std=c++11)
Die CMake-VariableCMAKE_CXX_FLAGS
muss nicht verwendet oder geändert werden , da CMake sicherstellt, dass der C ++ - Compiler mit den entsprechenden Befehlszeilenflags aufgerufen wird.Möglicherweise verwendet Ihr C ++ - Programm andere C ++ - Funktionen als
cxx_range_for
. Die globale CMake-EigenschaftCMAKE_CXX_KNOWN_FEATURES
listet die C ++ - Funktionen auf, aus denen Sie auswählen können.Anstatt zu verwenden
target_compile_features()
, können Sie den C ++ - Standard auch explizit angeben, indem Sie die CMake-EigenschaftenCXX_STANDARD
undCXX_STANDARD_REQUIRED
Ihr CMake-Ziel festlegen .Siehe auch meine ausführlichere Antwort .
quelle
ich benutze
Aber wenn du damit spielen willst
C++11
,g++ 4.6.1
ist das ziemlich alt. Versuchen Sie, eine neuereg++
Version zu erhalten.quelle
CXX_STANDARD
Antworten auf der Basis positiv bewertet , aber dies war die einzige Antwort, die in meiner Situation nützlich war.Der einfachste Weg, den Cxx-Standard festzulegen, ist:
Weitere Informationen finden Sie in der CMake-Dokumentation .
quelle
set(CMAKE_CXX_STANDARD 11)
die Standardeigenschaft für alle danach erstellten Ziele definieren.set
von @emlai vorgeschlagene Befehl global ist und alle nachfolgenden Ziele betrifft.Wie sich herausstellt, werden
SET(CMAKE_CXX_FLAGS "-std=c++0x")
viele C ++ 11-Funktionen aktiviert. Der Grund, warum es nicht funktionierte, war, dass die Aussage so aussah:Nach diesem Ansatz wurde die
-std=c++0x
Flagge irgendwie überschrieben und es funktionierte nicht. Das Setzen der Flags nacheinander oder die Verwendung einer Listenmethode funktioniert.quelle
CXX_STANDARD
Eigenschaft ist besser, da sie compilerunabhängig ist.Der einfachste Weg:
add_compile_options(-std=c++11)
quelle
Für CMake 3.8 und höher können Sie verwenden
quelle
PUBLIC
hier?PUBLIC
bedeutet, dass andere Ziele, die von Ihrem Ziel abhängen, ebenfalls C ++ 11 verwenden. Wenn Ihr Ziel beispielsweise eine Bibliothek ist, werden alle Ziele, die mit Ihrer Bibliothek verknüpfttarget_link_libraries
sind, mit C ++ 11-Unterstützung kompiliert.Dies ist eine weitere Möglichkeit, die C ++ 11-Unterstützung zu aktivieren.
Ich habe Fälle festgestellt, in denen nur diese Methode funktioniert und andere Methoden fehlschlagen. Vielleicht hat es etwas mit der neuesten Version von CMake zu tun.
quelle
add_definitions
wird nur zum Hinzufügen von DEFINITIONEN verwendet, dh -D ETWAS. Und wie @Emmanuel sagte, funktioniert es in vielen Fällen nicht.add_definitions
nicht zum Setzen von Flags gemacht wurde.Bei modernen CMake (> = 3.1) ist der beste Weg, globale Anforderungen zu setzen ,:
Es bedeutet "Ich möchte C ++ 11 für alle Ziele, es ist nicht optional, ich möchte keine GNU- oder Microsoft-Erweiterungen verwenden." Ab C ++ 17 ist dies meiner Meinung nach immer noch der beste Weg.
Quelle: Aktivieren von C ++ 11 und höher in CMake
quelle
Für mich funktioniert es, die folgende Zeile in Ihrer CMakeLists.txt festzulegen:
Durch Festlegen dieses Befehls werden die C ++ 11-Funktionen für den Compiler aktiviert. Nach Ausführung des
cmake ..
Befehls sollten Sie in der Lage sein,range based for loops
Ihren Code zu verwenden und fehlerfrei zu kompilieren.quelle
-std=c++11
, daset (CMAKE_CXX_STANDARD 11)
die Flagge verwendet wird-std=gnu++11
, was möglicherweise unerwünscht ist.set (CMAKE_CXX_EXTENSIONS OFF)
Ich denke nur diese beiden Zeilen sind genug.
quelle
target_compile_features
Funktion, die für jedes einzelne Ziel angewendet wird, wie in anderen Antworten gezeigt, ein empfehlenswerterer Ansatz.Für den Fall, dass Sie immer den neuesten C ++ - Standard aktivieren möchten, ist hier meine Erweiterung der Antwort von David Grayson angesichts der jüngsten (CMake 3.8 und CMake 3.11) Ergänzungen der Werte 17 und 20 für CMAKE_CXX_STANDARD):
(Verwenden Sie diesen Code anstelle
set (CMAKE_CXX_STANDARD 11)
der verknüpften Antwort.)quelle
Modernes cmake bietet einfachere Möglichkeiten, Compiler für die Verwendung einer bestimmten Version von C ++ zu konfigurieren. Das einzige, was jemand tun muss, ist die relevanten Zieleigenschaften festzulegen. Unter den von cmake unterstützten Eigenschaften werden die folgenden verwendet, um zu bestimmen, wie Compiler für die Unterstützung einer bestimmten Version von C ++ konfiguriert werden:
CXX_STANDARD
Legt den C ++ - Standard fest, dessen Funktionen zum Erstellen des Ziels angefordert werden. Stellen Sie dies als11
Ziel für C ++ 11 ein.CXX_EXTENSIONS
, ein Boolescher Wert, der angibt, ob compilerspezifische Erweiterungen angefordert werden. Wenn Sie dies alsOff
deaktivieren, wird die Unterstützung für alle compilerspezifischen Erweiterungen deaktiviert.Um dies zu demonstrieren, ist hier ein minimales Arbeitsbeispiel für a
CMakeLists.txt
.quelle
OS X und Homebrew LLVM im Zusammenhang:
Vergessen Sie nicht, danach cmake_minimum_required (VERSION 3.3) und project () aufzurufen!
Oder CMake wird
project()
implizit vor Zeile 1 eingefügt , was zu Problemen bei der Erkennung der Clang-Version und möglicherweise zu anderen Problemen führt. Hier ist ein verwandtes Problem .quelle