Kompilieren von C ++ 11 mit g ++

367

Ich versuche, meinen C ++ - Compiler auf C ++ 11 zu aktualisieren. Ich habe ein bisschen gesucht und bin zu dem Schluss gekommen, dass ich die Flagge verwenden muss -std=c++0xoder -std=gnu++0x, aber ich weiß nicht viel über Flaggen. Kann mir jemand helfen? (Ich benutze Ubuntu 12.04.)

Hier ist der Fehler, den ich vom Compiler erhalte, wenn ich versuche, eine Bibliothek zu verwenden, die in C ++ 11 enthalten ist (dh Array):

#include <array>
#include <iostream>

int main()
{
    std::array<int, 3> arr = {2, 3, 5};
    ...
}

Diese Datei erfordert Compiler- und Bibliotheksunterstützung für den kommenden ISO C ++ - Standard C ++ 0x. Diese Unterstützung ist derzeit experimentell und muss mit den Compileroptionen -std = c ++ 0x oder -std = gnu ++ 0x aktiviert werden.

Rontogiannis Aristofanis
quelle
5
In der neuesten Version müssen Sie wahrscheinlich -std=c++11stattdessen verwenden. Vielleicht sind aber beide erlaubt.
6
Dies vermisst viel Kontext. Zeigen Sie den vollständigen Befehl an, den Sie versucht haben (möglicherweise sogar Beispielcode, den Sie zu kompilieren versucht haben), und was tatsächlich fehlgeschlagen ist.
KillianDS
4
@classdaknok_t: beide sollten erlaubt sein, auch Ubuntu 12.04 g++-4.6wird standardmäßig ausgeliefert (was nur unterstützt -std=c++0x)
KillianDS
3
Fügen Sie gleich danach Flags hinzu g++, z g++ -std=c++0x _filename_ && ./a.out.
n. 'Pronomen' m.
1
Kam über diesen Beitrag und suchte nach einer Fehlermeldung mit dem Titel. Ich arbeite an einem QMAKE-Projekt. Die Lösung für mich bestand darin, der .pro-Datei CONFIG + = c ++ 11 hinzuzufügen.

Antworten:

529

Flags (oder Compileroptionen) sind nichts anderes als normale Befehlszeilenargumente, die an die ausführbare Compiler-Datei übergeben werden.

Angenommen, Sie rufen g ++ über die Befehlszeile (Terminal) auf:

$ g++ -std=c++11 your_file.cpp -o your_program

oder

$ g++ -std=c++0x your_file.cpp -o your_program

wenn das oben genannte nicht funktioniert.

Oskar N.
quelle
8
Vergessen Sie nicht, -Wall -ggleich nachg++
Basile Starynkevitch
7
@BasileStarynkevitch: Ich würde auch hinzufügen -Werror, kein Grund, nicht beim Starten eines Projekts.
Matthieu M.
3
Bessere C ++ 11-Unterstützung ist umstritten und bessere Diagnosen sehen heutzutage nicht viel besser aus (Clangs Seite, auf der sie beschrieben werden, verwendet GCC 4.2, das uralt ist). Gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely
58
Weiß jemand, ob / wann C ++ - Compiler den C ++ 11-Standard standardmäßig unterstützen, dh ohne Flag?
Dennis
2
Und falls Sie es noch nicht wissen, verwenden Sie in Visual C ++ einfach VC11 (Visual Studio 2012) oder höher, um C ++ 11-Funktionen zu haben
Gerrytan
44

Sie können Ihren g++Befehl per überprüfen :

which g++
g++ --version

Hier erfahren Sie, auf welchen Complier er gerade zeigt.

g++Führen Sie Folgendes aus, um zu 4.7 zu wechseln (vorausgesetzt, Sie haben es auf Ihrem Computer installiert):

sudo update-alternatives --config gcc

There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path              Priority   Status
------------------------------------------------------------
  0            /usr/bin/gcc-4.6   60        auto mode
  1            /usr/bin/gcc-4.6   60        manual mode
* 2            /usr/bin/gcc-4.7   40        manual mode

Wählen Sie dann 2als Auswahl (Mein Computer zeigt bereits auf g++4.7, also das *)

Sobald Sie den Complier umgeschaltet haben, führen Sie ihn erneut aus, um g++ --versionzu überprüfen, ob die Umschaltung korrekt erfolgt ist.

Kompilieren Sie nun Ihr Programm mit

g++ -std=c++11 your_file.cpp -o main
Harajyoti Das
quelle
Erwähnenswert ist möglicherweise, dass Versionen wie g ++ 4.4 möglicherweise einfach zu alt sind, um einige Funktionen auszuführen. Daher ist ein Upgrade erforderlich. Das Upgrade hängt von Ihrem System ab, und ich würde Methoden zum Kompilieren von g ++ selbst und zum Ersetzen des Compilers des Systems als Referenz vermeiden
Colin D
13

Ihr Ubuntu hat definitiv eine ausreichend aktuelle Version von g ++. Die zu verwendende Flagge ist -std=c++0x.

Michael Slade
quelle
Wie kannst du das sagen, er benutzt Ubuntu? Nur neugierig zu wissen.
Shravan40
22
@ Shravan40 OP sagt explizit I'm using Ubuntu 12.04.in der Frage.
Timothy Gu
10

Wenn Sie die GNU-Compiler-Erweiterungen beibehalten möchten, verwenden Sie -std = gnu ++ 0x anstelle von -std = c ++ 0x. Hier ist ein Zitat aus der Manpage:

Der Compiler kann mehrere Basisstandards wie c89 oder c ++ 98 und GNU-Dialekte dieser Standards wie gnu89 oder gnu ++ 98 akzeptieren. Durch die Angabe eines Basisstandards akzeptiert der Compiler alle Programme, die diesem Standard folgen, und solche, die GNU-Erweiterungen verwenden, die diesem nicht widersprechen. Beispielsweise deaktiviert -std = c89 bestimmte Funktionen von GCC, die mit ISO C90 nicht kompatibel sind, z. B. die Schlüsselwörter "asm" und "typeof", jedoch keine anderen GNU-Erweiterungen, die in ISO C90 keine Bedeutung haben, z. B. das Auslassen der mittlere Term eines "?:" - Ausdrucks. Wenn Sie jedoch einen GNU-Dialekt eines Standards angeben, werden alle Funktionen, die der Compiler unterstützt, aktiviert, auch wenn diese Funktionen die Bedeutung des Basisstandards ändern und einige streng konforme Programme möglicherweise abgelehnt werden. Der bestimmte Standard wird von -pedantic verwendet, um zu identifizieren, welche Funktionen bei dieser Version des Standards GNU-Erweiterungen sind. Zum Beispiel würde -std = gnu89 -pedantic vor // Kommentaren im C ++ - Stil warnen, -std = gnu99 -pedantic nicht.


quelle
Und was bringt Ihnen das, abgesehen vom binären ?:Operator? Die einzige andere Erweiterung, die mir in den Sinn kommt, Strukturausdrücke, wird durch die C ++ 11-Listeninitialisierung ersetzt. In jedem Fall bezieht sich dieses Zitat hauptsächlich auf C, nicht auf C ++.
Potatoswatter
9

Sie können auf den folgenden Link verweisen, für den Funktionen in einer bestimmten Compilerversion unterstützt werden. Es enthält eine umfassende Liste der Funktionsunterstützung im Compiler. GCC folgt dem Standard genau und implementiert ihn vor jedem anderen Compiler.

In Bezug auf Ihre Frage können Sie mit kompilieren

  1. g++ -std=c++11 für C ++ 11
  2. g++ -std=c++14 für C ++ 14
  3. g++ -std=c++17 für C ++ 17
  4. g++ -std=c++2aFür C ++ 20 finden Sie unter diesem Link eine Liste der Funktionsunterstützungen in GCC , obwohl noch nicht alle Funktionen von C ++ 20 unterstützt werden .

Die Liste ändert sich ziemlich schnell. Behalten Sie die Liste im Auge, wenn Sie darauf warten, dass eine bestimmte Funktion unterstützt wird.

Yadhu
quelle