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
Code der Datei main.c
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
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
| Option | Erklärung |
|---|---|
| -ansi | Unterstü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. |
| -DMACRO | Definiert das Makro MACRO mit der Zeichenkette "1". |
| -DMACRO=DEFN | Definiert 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. |
| -LDIRECTORY | Gibt 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 -O1 | Generierten 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. |
| -UMACRO | Hebt die Definition des Makros MACRO auf. |
| -w | Keine Warnmeldungen generieren. |
| -Wall | Alle Warnmeldungen generieren. |