Linux c++ vs. g++: Kompilieren unter Ubuntu Schritt für Schritt

Überblick

Wer C++-Software auf Linux-Plattformen wie Ubuntu entwickelt, begegnet im Terminal regelmäßig dem Kommando c++. Doch welche Rolle spielt dieser Befehl im System, wie unterscheidet er sich von g++ und wie greifen die internen Mechanismen ineinander? Dieser Leitfaden erklärt die Hintergründe der Linux-Toolchain und demonstriert praxisnah das Erstellen, Optimieren und Ausführen eigener Programme.

C++-Build-Umgebung einrichten und Compiler-Version ermitteln

Damit das Betriebssystem C++-Code übersetzen kann, muss zunächst die grundlegende Entwicklungsumgebung bereitgestellt werden. Unter Ubuntu bündelt das Metapaket build-essential alle erforderlichen Komponenten wie Compiler, Linker und Standardbibliotheken. Die Einrichtung erfolgt über folgenden Befehl:

Installation von build-essential unter Ubuntu

Um zu verifizieren, an welcher Stelle im Dateisystem der c++-Aufruf aufgelöst wird, lässt sich der absolute Pfad der Binärdatei über which c++ lokalisieren:

Ermittlung des Compiler-Pfads mit which c++

Welches Release und welche Patchstufe des Compilers aktiv im System hinterlegt sind, gibt das Flag --version detailliert aus:

⚙️ [Wichtige Compiler-Flags im Überblick]

-o <file> : Legt den Zieldateinamen für das fertig gelinkte Binary fest.
-c : Führt nur den Übersetzungsschritt aus und erzeugt eine Objektdatei (.o), ohne den Linker aufzurufen.
-Wall : Aktiviert alle empfohlenen Diagnose- und Warnmeldungen für sauberen Quellcode.
-O2 : Wendet umfassende Code-Optimierungen an, um Laufzeit und Dateigröße auszubalancieren.
-std=<standard> : Bestimmt die zugrunde liegende Sprachversion des C++-Standards (z. B. c++17, c++20).
-g : Fügt Symbole für die Fehlersuche mit Debuggern wie GDB in die Binärdatei ein.

Ausgabe der Compiler-Version und Build-Details

Hinter dem Namen /usr/bin/c++ verbirgt sich kein eigenständiger Compiler-Quellbaum, sondern eine Verknüpfung. Eine detaillierte Dateiauflistung mit ls -l /usr/bin/c++ legt die zugrunde liegende Symlink-Kette und die Zugriffsrechte offen:

Detaillierte Link-Analyse von /usr/bin/c++

Auf Debian- und Ubuntu-Systemen wird dieser Verweis über das Alternativen-System gesteuert. Mittels update-alternatives --display c++ 2>/dev/null || readlink -f /usr/bin/c++ lässt sich die Verknüpfungshierarchie bis zur tatsächlichen physischen Binärdatei zurückverfolgen:

Ermittlung des tatsächlichen Compiler-Binaries via update-alternatives oder readlink

Hierbei wird deutlich: Der Systemaufruf c++ dient als standardisierter Alias, der standardmäßig auf den installierten GNU-Compiler g++ verweist.

Basisprogramm erstellen, übersetzen und ausführen

Um den Arbeitsablauf in der Praxis zu testen, erstellen wir zunächst eine minimalistische Quelltextdatei hello.cpp, die eine Begrüßungsnachricht ausgibt:

Erstellung der Datei hello.cpp per Here-Doc

Anschließend wird hello.cpp über den c++-Befehl kompiliert. Durch das Einbinden von Warnhinweisen und Optimierungsstufen entsteht die saubere Binärdatei hello. Wenn der Code frei von Unregelmäßigkeiten ist, schließt der Compiler den Vorgang ohne Konsolenausgabe ab:

Kompilierung von hello.cpp mit Parametern für Warnungen und Optimierung

Die frisch generierte Datei kann nun im aktuellen Arbeitsverzeichnis direkt gestartet werden. Auf dem Terminal erscheint die programmierte Ausgabe "Hello from Linux c++!":

Ausführung des fertigen Programms hello

Modernes C++: Kompilieren nach C++20-Standard (-std=c++20)

Aktuelle C++-Sprachmittel erfordern eine entsprechende Konfiguration des Compilers. Zur Demonstration legen wir die Datei modern.cpp an, welche neuere Features wie std::string_view und constexpr kombiniert:

C++20-Beispielcode in modern.cpp schreiben

Über das Flag -std=c++20 weisen wir den c++-Compiler an, die Sprachsyntax gemäß der C++20-Spezifikation zu interpretieren und das ausführbare Programm modern zu erzeugen:

Kompilieren mit expliziter C++20-Standardangabe

Ein abschließender Funktionstest durch Ausführen von ./modern bestätigt die erfolgreiche Interpretation des Codes, indem die Zeile "Modern C++20 on Ubuntu" auf der Konsole ausgegeben wird:

Start des mit C++20 gebauten Binaries modern

Damit ist die Funktionsweise des Befehls c++ unter Linux sowie sein Zusammenspiel mit g++ verständlich aufgeschlüsselt. Mit den vorgestellten Schaltern verfügen Sie über ein solides Fundament, um eigene Softwareprojekte auf der Ubuntu-Konsole zielgerichtet und performant zu kompilieren.