C++11 mit g++ kompilieren

Lesezeit: 6 Minuten

C11 mit g kompilieren
Rontogiannis Aristofanis

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++0x oder -std=gnu++0x, aber ich weiß nicht viel über Flaggen. Kann mir jemand helfen? (Ich verwende 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 (z. B. 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.

  • In der neuesten Version müssen Sie wahrscheinlich verwenden -std=c++11 stattdessen. Vielleicht ist aber auch beides erlaubt.

    Benutzer1203803

    28. April 2012 um 12:56 Uhr

  • Da fehlt viel Kontext. Zeigen Sie den vollständigen Befehl, den Sie versucht haben (vielleicht sogar Beispielcode, den Sie zu kompilieren versucht haben), und was tatsächlich fehlgeschlagen ist.

    – KillianDS

    28. April 2012 um 12:56 Uhr

  • @classdaknok_t: beides sollte erlaubt sein, auch Ubuntu 12.04-Schiffe g++-4.6 standardmäßig (was nur unterstützt -std=c++0x)

    – KillianDS

    28. April 2012 um 12:57 Uhr


  • Fügen Sie direkt danach Flaggen hinzu g++z.B g++ -std=c++0x _filename_ && ./a.out.

    – n. 1.8e9-wo-ist-meine-Aktie m.

    28. April 2012 um 13:23 Uhr

  • Bin auf diesen Beitrag gestoßen und habe nach einer Fehlermeldung mit dem Titel gesucht. Ich arbeite an einem QMAKE-Projekt. Die Lösung für mich war das Hinzufügen von CONFIG += c++11 zur .pro-Datei.

    Benutzer1800885

    12. Januar 2017 um 20:35 Uhr

Flags (oder Compiler-Optionen) sind nichts anderes als gewöhnliche 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.

  • Vergessen Sie nicht zu setzen -Wall -g direkt im Anschluss g++

    – Basile Starynkevitch

    28. April 2012 um 13:41 Uhr

  • @BasileStarynkevitch: Ich würde hinzufügen -Werror auch kein Grund dagegen, wenn man ein Projekt startet.

    – Matthias M.

    28. April 2012 um 14:14 Uhr

  • Bessere C++11-Unterstützung ist umstritten und bessere Diagnosen sehen heutzutage nicht viel besser aus (Clangs Seite, die sie beschreibt, verwendet GCC 4.2, das uralt ist). gcc.gnu.org/wiki/ClangDiagnosticsComparison 😉

    – Jonathan Wakely

    18. Mai 2012 um 17:52 Uhr

  • Weiß jemand, ob/wann C++-Compiler standardmäßig den C++11-Standard unterstützen, also ohne Flag?

    – Denis

    6. April 2013 um 7:17 Uhr

  • 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

    4. Dezember 2014 um 2:40 Uhr

1646883015 913 C11 mit g kompilieren
Harajyoti Das

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

which g++
g++ --version

Dadurch erfahren Sie, auf welchen Compiler er gerade zeigt.

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

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 aus 2 als Auswahl (Meine Maschine zeigt bereits auf g++ 4.7, also die *)

Sobald Sie den Compiler umschalten, führen Sie ihn erneut aus g++ --version um zu überprüfen, ob die Umschaltung korrekt erfolgt ist.

Kompilieren Sie nun Ihr Programm mit

g++ -std=c++11 your_file.cpp -o main

  • Erwähnenswert ist möglicherweise, dass Versionen wie g++ 4.4 möglicherweise einfach zu alt sind, um einige Funktionen auszuführen, sodass ein Upgrade erforderlich ist. Das Upgrade hängt von Ihrem System ab, und ich würde Methoden vermeiden, g++ selbst zu kompilieren und den Compiler des Systems als Referenz zu ersetzen

    – Colin D

    30. August 2016 um 18:07 Uhr

1646883016 128 C11 mit g kompilieren
jadhu

Sie können sich auf Folgendes beziehen Verknüpfung um zu wissen, welche Funktionen in welcher Version des Compilers unterstützt werden. Es hat eine erschöpfende Liste der Feature-Unterstützung in modernen Compilern. Scheint, als ob GCC dem Standard sehr genau folgt und vor jedem anderen Compiler implementiert.

In Bezug auf Ihre Frage können Sie mit kompilieren

  1. g++ source_file.cpp -o executable_name -std=c++11 für C++11
  2. g++ source_file.cpp -o executable_name -std=c++14 für C++14
  3. g++ source_file.cpp -o executable_name -std=c++17 für C++17
  4. g++ source_file.cpp -o executable_name -std=c++2a Für C++20 werden noch nicht alle Funktionen von C++20 unterstützt. Beziehen Sie sich darauf Verknüpfung für die Feature-Support-Liste in GCC.

Die Liste ändert sich ziemlich schnell, behalten Sie die Liste im Auge, wenn Sie darauf warten, dass ein bestimmtes Feature unterstützt wird.

1646883016 338 C11 mit g kompilieren
Michael Slade

Ihr Ubuntu hat auf jeden Fall eine ausreichend aktuelle Version von g++. Das zu verwendende Flag ist -std=c++0x.

Wenn Sie die GNU-Compiler-Erweiterungen beibehalten möchten, verwenden Sie -std=gnu++0x statt -std=c++0x. Hier 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 diejenigen, die GNU-Erweiterungen verwenden, die ihm nicht widersprechen. Beispielsweise deaktiviert -std=c89 bestimmte Funktionen von GCC, die mit ISO C90 nicht kompatibel sind, wie die Schlüsselwörter „asm“ und „typeof“, aber keine anderen GNU-Erweiterungen, die in ISO C90 keine Bedeutung haben, wie z. B. Auslassen das mittlere Glied eines „?:“-Ausdrucks. Andererseits werden durch die Angabe eines GNU-Dialekts eines Standards alle Funktionen aktiviert, die der Compiler unterstützt, selbst wenn diese Funktionen die Bedeutung des Basisstandards ändern und einige streng konforme Programme abgelehnt werden können. Der jeweilige Standard wird von -pedantic verwendet, um zu identifizieren, welche Funktionen GNU-Erweiterungen für diese Version des Standards sind. Beispielsweise würde -std=gnu89 -pedantic vor Kommentaren im C++-Stil warnen //, während -std=gnu99 -pedantic dies nicht tun würde.

  • Und was bringt Ihnen das, abgesehen von der Binärzahl? ?: 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++.

    – Kartoffelklatsche

    28. April 2012 um 14:06 Uhr

1646883016 669 C11 mit g kompilieren
Dada

Verwenden -std=c++11 Compiler-Flag für ISO C++11.
Weitere Einzelheiten zu C++-Compiler-Flags und -Optionen finden Sie unter Überprüfen Sie dies.

  • Und was bringt Ihnen das, abgesehen von der Binärzahl? ?: 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++.

    – Kartoffelklatsche

    28. April 2012 um 14:06 Uhr

985930cookie-checkC++11 mit g++ kompilieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy