gcc und g++ sind die C- und C++-Compiler von GNU. Wenn gcc/g++ kompiliert, werden insgesamt 4 Schritte ausgeführt:

  • 1. Vorverarbeitung, Erzeugung von .i-Dateien [Präprozessor cpp]
  • 2. Umwandeln der vorverarbeiteten Datei in Assemblersprache, Erzeugung von .s-Dateien [Compiler egcs]
  • 3. Umwandeln von Assembly in Objektcode (Maschinencode), Erzeugung von .o-Dateien [Assembler as]
  • 4. Linken des Objektcodes zur Erzeugung eines ausführbaren Programms [Linker ld]

Parameterdetails

-x language filename

Legt die von der Datei verwendete Sprache fest, wodurch die Endung ungültig wird; gilt für mehrere nachfolgende Dateien. Das heißt, konventionsgemäß ist die Endung für die Sprache C .c und die Endung für C++ .C oder .cpp. Wenn du sehr eigenwillig bist und entscheidest, dass die Endung deiner C-Codedatei .pig ist, haha, dann musst du diesen Parameter verwenden. Dieser Parameter wirkt sich auf alle Dateinamen nach ihm aus, bis der nächste Parameter verwendet wird. Die verwendbaren Parameter sind folgende: 'c', 'objective-c', 'c-header', 'c++', 'cpp-output', 'assembler' und 'assembler-with-cpp'.

Wenn du das Englische siehst, solltest du es verstehen.

Beispielverwendung:

gcc -x c hello.pig 
  

-x none filename

Schaltet die vorherige Option aus, das heißt, gcc soll den Dateityp automatisch anhand der Dateinamen-Endung erkennen.

Beispielverwendung:

gcc -x c hello.pig -x none hello2.c 
  

-c

Nur Vorverarbeitung, Kompilierung und Assemblierung aktivieren, das heißt, es wandelt das Programm nur in eine obj-Datei um.

Beispielverwendung:

gcc -c hello.c 

Es erzeugt eine .o-obj-Datei.

-S

Nur Vorverarbeitung und Kompilierung aktivieren, das heißt, die Datei in Assembler-Code kompilieren.

Beispielverwendung:

gcc -S hello.c 

Es erzeugt .s-Assembler-Code, den du mit einem Texteditor ansehen kannst.

-E

Nur die Vorverarbeitung aktivieren; dabei wird keine Datei erzeugt. Du musst sie in eine Ausgabedatei umleiten.

Beispielverwendung:

gcc -E hello.c > pianoapan.txt 
gcc -E hello.c | more 

Schau es dir langsam an; ein Hello World wird ebenfalls zu 800 Zeilen Code vorverarbeitet.

-o

Gibt den Zielnamen an. Standardmäßig ist die von gcc kompilierte Datei a.out, was hässlich ist. Wenn du genauso empfindest wie ich, ändere es, haha.

Beispielverwendung:

  
gcc -o hello.exe hello.c (哦,windows用习惯了) 
  gcc -o hello.asm -S hello.c

-pipe

  

Verwenden Sie Pipes anstelle von temporären Dateien während der Kompilierung. Es kann Probleme geben, wenn Nicht-GNU-Assembler-Werkzeuge verwendet werden.

  
gcc -pipe -o hello.exe hello.c 

-ansi

Schalten Sie Funktionen in GNU C ab, die mit ANSI C inkompatibel sind, und aktivieren Sie die ANSI-C-eigenen Funktionen (einschließlich des Verbots einiger Schlüsselwörter wie asm, inline, typeof sowie von Präprozessormakros wie UNIX, vax usw.).

-fno-asm

Diese Option implementiert einen Teil der Funktionalität der ansi-Option; sie verbietet die Verwendung von asm, inline und typeof als Schlüsselwörter.

    

-fno-strict-prototype

Nur für g++ wirksam. Mit dieser Option behandelt g++ Funktionen ohne Parameter so, als hätten sie keine explizite Deklaration der Anzahl und des Typs der Parameter, und nicht so, als hätten sie keine Parameter.

Und gcc behandelt Funktionen ohne Parameter unabhängig davon, ob dieser Parameter verwendet wird, so, als hätten sie keine explizite Typdeklaration.

  

-fthis-is-varialble

Das heißt, um mit traditionellem C++ übereinzustimmen, wird zugelassen, dass this als gewöhnliche Variable verwendet wird.

  

-fcond-mismatch

Erlauben, dass die Typen des zweiten und dritten Parameters eines Bedingungsausdrucks nicht übereinstimmen; der Wert des Ausdrucks hat den Typ void.

  

-funsigned-char, -fno-signed-char, -fsigned-char, -fno-unsigned-char

Diese vier Parameter dienen zum Festlegen des char-Typs und bestimmen, ob char auf unsigned char (die ersten beiden Parameter) oder signed char (die letzten beiden Parameter) gesetzt wird.

  

-include file

Binden Sie einen bestimmten Code ein. Einfach gesagt: Wenn beim Kompilieren einer bestimmten Datei eine andere Datei benötigt wird, können Sie damit diese festlegen. Seine Funktion entspricht der Verwendung im Code:#include<filename>。

Beispielverwendung:

  
gcc hello.c -include /root/pianopan.h 
  

-imacros file

  

Die Makros der Datei werden in die gcc/g++-Eingabedatei expandiert; die Makrodefinitionen selbst erscheinen nicht in der Eingabedatei.

  

-Dmacro

Entspricht in der Sprache C:#define macro

  

-Dmacro=defn

Entspricht in der Sprache C:#define macro=defn

  

-Umacro

Entspricht in der Sprache C:#undef macro

-undef

  

Hebt die Definition aller nicht standardmäßigen Makros auf.

  

-Idir

Wenn Sie #include "file"verwenden, sucht gcc/g++ zuerst nach der von Ihnen angegebenen Header-Datei im aktuellen Verzeichnis. Wenn sie nicht gefunden wird, greift es auf das Standard-Header-Dateiverzeichnis zurück. Wenn Sie mit -I ein Verzeichnis angeben, sucht es zuerst in dem von Ihnen angegebenen Verzeichnis und dann in der normalen Reihenfolge.

Für #include<file> sucht gcc/g++ im durch -I angegebenen Verzeichnis; wenn nicht gefunden, sucht es anschließend im Standard-Header-Dateiverzeichnis des Systems.

  

-I-

  

Es hebt die Wirkung des vorherigen Parameters auf, daher wird es im Allgemeinen nach -Idir verwendet.

  

-idirafter dir

Wenn die Suche im -I-Verzeichnis fehlschlägt, wird in diesem Verzeichnis gesucht.

  

-iprefix prefix 、-iwithprefix dir

Wird im Allgemeinen zusammen verwendet; wenn die Suche im -I-Verzeichnis fehlschlägt, wird unter prefix+dir gesucht.

  

-nostdinc

  

Veranlasst den Compiler, nicht mehr im Standard-Header-Dateiverzeichnis des Systems nach Header-Dateien zu suchen; wird im Allgemeinen zusammen mit -I verwendet, um den Speicherort von Header-Dateien explizit einzuschränken.

  

-nostdin C++

 

Gibt an, nicht in den von g++ vorgegebenen Standardpfaden zu suchen, aber weiterhin in anderen Pfaden zu suchen. Diese Option wird beim Erstellen der libg++-Bibliothek verwendet.

  

-C

 

Kommentarinformationen während der Vorverarbeitung nicht löschen; wird im Allgemeinen mit -E verwendet. Manchmal ist es sehr praktisch für die Analyse von Programmen.

  

-M

 

Erzeugt Dateiabhängigkeitsinformationen. Sie enthält den gesamten Quellcode, von dem die Zieldatei abhängt. Sie könnengcc -M hello.cverwenden, um es zu testen; es ist sehr einfach.

  

-MM

 

Wie oben, aber es ignoriert die durch#include<file>verursachten Abhängigkeitsbeziehungen.

-MD

 

Wie -M, aber die Ausgabe wird in eine .d-Datei umgeleitet.

-MMD

 

Wie -MM, aber die Ausgabe wird in eine .d-Datei umgeleitet.

  

-Wa,option

 

Diese Option übergibt option an den Assembler; wenn option ein Komma enthält, wird option in mehrere Optionen aufgeteilt und diese dann an den Assembler übergeben.

  

-Wl.option

 

Diese Option übergibt option an den Linker; wenn ein Komma in option enthalten ist, teilt sie option in mehrere Optionen auf und übergibt sie dann an den Linker.

  

-llibrary

 

Geben Sie die während der Kompilierung verwendete Bibliothek an.

  

Beispielverwendung

  
gcc -lcurses hello.c
  

Kompilieren Sie das Programm unter Verwendung der ncurses-Bibliothek.

  

-Ldir

  

Geben Sie den Pfad an, in dem während der Kompilierung nach Bibliotheken gesucht wird. Zum Beispiel können Sie ihn für Ihre eigenen Bibliotheken verwenden, um das Verzeichnis anzugeben; andernfalls sucht der Compiler nur in den Standardbibliotheksverzeichnissen. Dieses dir ist der Name des Verzeichnisses.

  

-O0 、-O1 、-O2 、-O3

  

Die 4 Stufen der Compiler-Optimierungsoptionen: -O0 bedeutet keine Optimierung, -O1 ist die Standardeinstellung, und -O3 ist die höchste Optimierungsstufe.

      

-g

  

Nur für den Compiler: Erzeugen Sie während der Kompilierung Debuginformationen.

  

-gstabs

  

Diese Option erzeugt Debuginformationen im stabs-Format, enthält aber keine gdb-Debuginformationen.

  

-gstabs+

  

Diese Option erzeugt Debugging-Informationen im stabs-Format und enthält zusätzliche Debugging-Informationen, die nur von gdb verwendet werden.

  

-ggdb

  

Diese Option erzeugt so viele von gdb nutzbare Debugging-Informationen wie möglich.

-static

  

Diese Option verbietet die Verwendung dynamischer Bibliotheken, sodass die kompilierte Ausgabe im Allgemeinen sehr groß ist und ausgeführt werden kann, ohne dynamische Linkbibliotheken zu benötigen.

-share

 

Diese Option versucht, dynamische Bibliotheken zu verwenden, sodass die erzeugte Datei kleiner ist, aber das System dynamische Bibliotheken benötigt.

-traditional

  

Versucht, den Compiler dazu zu bringen, traditionelle C-Sprachmerkmale zu unterstützen.

GCC ist der C- und C++-Compiler von GNU. Tatsächlich kann GCC drei Sprachen kompilieren: C, C++ und Object C (eine objektorientierte Erweiterung von C). Mit dem Befehl gcc können Sie C- und C++-Quellprogramme gleichzeitig kompilieren und linken.

Wenn Sie zwei oder ein paar C-Quelldateien haben, können Sie GCC auch bequem verwenden, um sie zu kompilieren, zu linken und eine ausführbare Datei zu erzeugen. Angenommen, Sie haben zwei Quelldateien, main.c und factorial.c, und möchten nun ein Programm kompilieren und erzeugen, das Fakultäten berechnet.

Code der Datei factorial.c

int factorial (int n) {   if (n <= 1)    return 1;   else    return factorial (n - 1) * n; }

Code der Datei main.c

#include <stdio.h> #include <unistd.h> int factorial (int n); int main (int argc, char **argv) {   int n;   if (argc < 2)   {     printf ("Verwendung: %s n\n", argv [0]);     return -1;   }   else   {    n = atoi (argv[1]);    printf ("Fakultät von %d ist %d.\n", n, factorial (n));    }   return 0; }

Verwenden Sie den folgenden Befehl, um zu kompilieren und eine ausführbare Datei zu erzeugen und das Programm auszuführen:

$ gcc -o factorial main.c factorial.c 
$ ./factorial 5 
Factorial of 5 is 120. 

GCC kann verwendet werden, um sowohl C-Programme als auch C++-Programme zu kompilieren. Im Allgemeinen bestimmt der C-Compiler anhand der Dateiendung der Quelldatei, ob es sich um ein C-Programm oder ein C++-Programm handelt. In Linux ist die Dateiendung von C-Quelldateien .c, während die Dateiendung von C++-Quelldateien .C oder .cpp ist. Allerdings kann der Befehl gcc nur C++-Quelldateien kompilieren und nicht automatisch mit den Bibliotheken linken, die von C++-Programmen verwendet werden. Daher wird normalerweise der Befehl g++ verwendet, um die Kompilierung und das Linken von C++-Programmen abzuschließen; dieses Programm ruft automatisch gcc auf, um die Kompilierung durchzuführen. Angenommen, wir haben die folgende C++-Quelldatei (hello.c):

hello.c-Dateicode

#include <iostream> void main (void) {   cout << "Hello, world!" << endl; }

Dann können Sie den g++-Befehl wie folgt aufrufen, um zu kompilieren, zu linken und eine ausführbare Datei zu erzeugen:

$ g++ -o hello hello.c 
$ ./hello 
Hello, world! 

Häufige Optionen des gcc-Befehls

OptionErklärung
-ansiUnterstützt nur die C-Syntax des ANSI-Standards. Diese Option verbietet bestimmte Merkmale von GNU C, wie die Schlüsselwörter asm oder typeof.
-c Kompiliert und erzeugt nur Objektdateien.
-DMACRODefiniert das Makro MACRO mit der Zeichenkette "1".
-DMACRO=DEFNDefiniert das Makro MACRO mit der Zeichenkette "DEFN".
-E Nur den C-Präprozessor ausführen.
-g Debugging-Informationen erzeugen. Der GNU-Debugger kann diese Informationen verwenden.
-IDIRECTORY Gibt einen zusätzlichen Suchpfad DIRECTORY für Header-Dateien an.
-LDIRECTORYGibt einen zusätzlichen Bibliothekssuchpfad DIRECTORY an.
-lLIBRARY Beim Linken die angegebene Bibliothek LIBRARY suchen.
-m486 Optimiert den Code für den 486.
-o FILE Erzeugt die angegebene Ausgabedatei. Wird beim Erzeugen ausführbarer Dateien verwendet.
-O0 Keine Optimierung durchführen.
-O oder -O1Generierten Code optimieren.
-O2 Weiter optimieren.
-O3 Weiter optimieren als -O2, einschließlich Inline-Funktionen.
-shared Shared-Object-Dateien erzeugen. Wird normalerweise beim Erstellen gemeinsam genutzter Bibliotheken verwendet.
-static Shared Linking verbieten.
-UMACROHebt die Definition des Makros MACRO auf.
-w Keine Warnmeldungen generieren.
-Wall Alle Warnmeldungen generieren.