gcc et g++ sont les compilateurs C et C++ de GNU. Lorsque gcc/g++ effectue la compilation, il procède en 4 étapes au total :

  • 1. Prétraitement, génération de fichiers .i [préprocesseur cpp]
  • 2. Convertir le fichier prétraité en langage assembleur, génération de fichiers .s [compilateur egcs]
  • 3. Convertir l'assembleur en code objet (code machine), génération de fichiers .o [assembleur as]
  • 4. Lier le code objet pour générer un programme exécutable [éditeur de liens ld]

Détails des paramètres

-x langage nom_fichier

Définissez le langage utilisé par le fichier, en invalidant le nom du suffixe, valable pour plusieurs fichiers suivants. C'est-à-dire que, par convention, le suffixe pour le langage C est .c, et le suffixe pour C++ est .C ou .cpp. Si vous êtes très individualiste et décidez que le suffixe de votre fichier de code C est .pig, haha, alors vous devez utiliser ce paramètre. Ce paramètre prend effet sur tous les noms de fichiers après lui, jusqu'à ce que le paramètre suivant soit utilisé. Les paramètres qui peuvent être utilisés sont les suivants : 'c', 'objective-c', 'c-header', 'c++', 'cpp-output', 'assembler', et 'assembler-with-cpp'.

En lisant l'anglais, vous devriez comprendre.

Exemple d'utilisation :

gcc -x c hello.pig 
  

-x none nom_fichier

Désactivez l'option précédente, c'est-à-dire laissez gcc identifier automatiquement le type de fichier en fonction du suffixe du nom de fichier.

Exemple d'utilisation :

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

-c

Activez uniquement le prétraitement, la compilation et l'assemblage, c'est-à-dire que cela transforme seulement le programme en fichier obj.

Exemple d'utilisation :

gcc -c hello.c 

Il générera un fichier obj .o.

-S

Activez uniquement le prétraitement et la compilation, c'est-à-dire compilez le fichier en code assembleur.

Exemple d'utilisation :

gcc -S hello.c 

Il générera du code assembleur .s, que vous pouvez consulter avec un éditeur de texte.

-E

Activez uniquement le prétraitement ; cela ne génère pas de fichier. Vous devez le rediriger vers un fichier de sortie.

Exemple d'utilisation :

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

Prenez le temps de regarder ; un hello world est aussi prétraité en 800 lignes de code.

-o

Spécifiez le nom de la cible. Par défaut, le fichier compilé par gcc est a.out, ce qui est laid. Si vous ressentez la même chose que moi, changez-le, haha.

Exemple d'utilisation :

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

-pipe

  

Utilisez des pipes au lieu de fichiers temporaires pendant la compilation. Il peut y avoir quelques problèmes lors de l'utilisation d'outils d'assemblage non-GNU.

  
gcc -pipe -o hello.exe hello.c 

-ansi

Désactivez les fonctionnalités de GNU C qui sont incompatibles avec ANSI C, et activez les fonctionnalités propres à ANSI C (y compris l'interdiction de certains mots-clés comme asm, inline, typeof, ainsi que des macros de préprocesseur telles que UNIX, vax, etc.).

-fno-asm

Cette option met en œuvre une partie des fonctionnalités de l'option ansi ; elle interdit d'utiliser asm, inline et typeof comme mots-clés.

    

-fno-strict-prototype

Efficace uniquement pour g++. Avec cette option, g++ traitera les fonctions sans paramètres comme n'ayant aucune déclaration explicite du nombre et du type des paramètres, plutôt que comme n'ayant aucun paramètre.

Et gcc, que ce paramètre soit utilisé ou non, traitera les fonctions sans paramètres comme n'ayant aucune déclaration de type explicite.

  

-fthis-is-varialble

C'est-à-dire, pour s'aligner sur le C++ traditionnel, permettre d'utiliser this comme une variable ordinaire.

  

-fcond-mismatch

Autoriser les types des deuxième et troisième paramètres d'une expression conditionnelle à ne pas correspondre ; la valeur de l'expression sera de type void.

  

-funsigned-char 、-fno-signed-char、-fsigned-char 、-fno-unsigned-char

Ces quatre paramètres servent à définir le type char, en déterminant s'il faut définir char comme unsigned char (deux premiers paramètres) ou signed char (deux derniers paramètres).

  

-include file

Inclure un code donné. En termes simples, lors de la compilation d'un certain fichier et si vous avez besoin d'un autre fichier, vous pouvez l'utiliser pour définir cela. Sa fonction équivaut à utiliser dans le code :#include<filename>。

Exemple d'utilisation :

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

-imacros file

  

Développe les macros du fichier dans le fichier d'entrée de gcc/g++ ; les définitions de macros elles-mêmes n'apparaissent pas dans le fichier d'entrée.

  

-Dmacro

Équivalent, en langage C, à :#define macro

  

-Dmacro=defn

Équivalent, en langage C, à :#define macro=defn

  

-Umacro

Équivalent, en langage C, à :#undef macro

-undef

  

Annule la définition de toute macro non standard.

  

-Idir

Lorsque vous utilisez #include "file"gcc/g++ cherchera d'abord le fichier d'en-tête que vous avez spécifié dans le répertoire courant. S'il n'est pas trouvé, il revient au répertoire de fichiers d'en-tête par défaut. Si vous utilisez -I pour spécifier un répertoire, il cherchera d'abord dans le répertoire que vous avez spécifié, puis cherchera dans l'ordre normal.

Pour #include<file>, gcc/g++ effectuera une recherche dans le répertoire spécifié par -I ; s'il n'est pas trouvé, il cherchera ensuite dans le répertoire de fichiers d'en-tête par défaut du système.

  

-I-

  

Il annule la fonction du paramètre précédent, il est donc généralement utilisé après -Idir.

  

-idirafter dir

Si la recherche dans le répertoire -I échoue, il cherchera dans ce répertoire.

  

-iprefix prefix 、-iwithprefix dir

Généralement utilisés ensemble ; lorsque la recherche dans le répertoire -I échoue, il cherchera sous prefix+dir.

  

-nostdinc

  

Fait que le compilateur ne recherche plus les fichiers d'en-tête dans le répertoire de fichiers d'en-tête par défaut du système ; généralement utilisé avec -I pour limiter explicitement l'emplacement des fichiers d'en-tête.

  

-nostdin C++

 

Spécifier de ne pas rechercher dans les chemins standard désignés par g++, mais continuer à rechercher dans les autres chemins. Cette option est utilisée lors de la création de la bibliothèque libg++.

  

-C

 

Ne pas supprimer les informations de commentaire lors du prétraitement ; généralement utilisé avec -E. Parfois, c'est très pratique pour analyser des programmes.

  

-M

 

Générer les informations de dépendance de fichier. Cela inclut tout le code source dont dépend le fichier cible. Vous pouvez utilisergcc -M hello.cpour le tester ; c'est très simple.

  

-MM

 

Identique à ce qui précède, mais il ignorera les relations de dépendance#include<file>causées par ceci.

-MD

 

Identique à -M, mais la sortie sera redirigée vers un fichier .d.

-MMD

 

Identique à -MM, mais la sortie sera redirigée vers un fichier .d.

  

-Wa,option

 

Cette option transmet option à l'assembleur ; si option contient une virgule, elle divise option en plusieurs options, puis les transmet à l'assembleur.

  

-Wl.option

 

Cette option transmet option à l'éditeur de liens ; si option contient une virgule, elle découpe option en plusieurs options, puis les transmet à l'éditeur de liens.

  

-llibrary

 

Spécifiez la bibliothèque utilisée lors de la compilation.

  

Exemple d'utilisation

  
gcc -lcurses hello.c
  

Compilez le programme en utilisant la bibliothèque ncurses.

  

-Ldir

  

Spécifiez le chemin de recherche des bibliothèques lors de la compilation. Par exemple, pour vos propres bibliothèques, vous pouvez l'utiliser pour spécifier le répertoire ; sinon, le compilateur ne recherchera que dans les répertoires de bibliothèques standard. Ce dir est le nom du répertoire.

  

-O0 、-O1 、-O2 、-O3

  

Les 4 niveaux d'options d'optimisation du compilateur : -O0 signifie aucune optimisation, -O1 est la valeur par défaut, et -O3 est le niveau d'optimisation le plus élevé.

      

-g

  

Uniquement pour le compilateur, générez des informations de débogage lors de la compilation.

  

-gstabs

  

Cette option génère des informations de débogage au format stabs, mais n'inclut pas les informations de débogage gdb.

  

-gstabs+

  

Cette option génère des informations de débogage au format stabs, et inclut des informations de débogage supplémentaires destinées uniquement à gdb.

  

-ggdb

  

Cette option générera autant d'informations de débogage utilisables par gdb que possible.

-static

  

Cette option interdira l'utilisation de bibliothèques dynamiques, de sorte que le résultat compilé est généralement très volumineux et peut s'exécuter sans avoir besoin de bibliothèques de liens dynamiques.

-share

 

Cette option tentera d'utiliser des bibliothèques dynamiques, de sorte que le fichier généré est plus petit, mais le système doit disposer de bibliothèques dynamiques.

-traditional

  

Tenter de faire en sorte que le compilateur prenne en charge les fonctionnalités traditionnelles du langage C.

GCC est le compilateur C et C++ de GNU. En fait, GCC peut compiler trois langages : C, C++ et Object C (une extension orientée objet de C). En utilisant la commande gcc, vous pouvez compiler et lier en même temps des programmes source C et C++.

Si vous avez deux ou quelques fichiers source C, vous pouvez aussi utiliser commodément GCC pour compiler, lier et générer un fichier exécutable. Par exemple, supposons que vous ayez deux fichiers source, main.c et factorial.c, et que vous souhaitiez maintenant compiler et générer un programme qui calcule des factorielles.

code du fichier factorial.c

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

Code du fichier main.c

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

Utilisez la commande suivante pour compiler et générer un fichier exécutable, et exécuter le programme:

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

GCC peut être utilisé pour compiler à la fois des programmes C et des programmes C++. Généralement, le compilateur C détermine s'il s'agit d'un programme C ou d'un programme C++ par le suffixe du fichier source. Sous Linux, le suffixe des fichiers sources C est .c, tandis que le suffixe des fichiers sources C++ est .C ou .cpp. Cependant, la commande gcc ne peut compiler que des fichiers sources C++ et ne peut pas automatiquement se lier aux bibliothèques utilisées par les programmes C++. Par conséquent, la commande g++ est généralement utilisée pour terminer la compilation et l'édition de liens des programmes C++; ce programme appelle automatiquement gcc pour implémenter la compilation. Supposons que nous ayons le fichier source C++ suivant (hello.c):

code du fichier hello.c

#include <iostream> void main (void) {   cout << "Bonjour, le monde !" << endl; }

Vous pouvez ensuite appeler la commande g++ comme suit pour compiler, lier et générer un fichier exécutable :

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

Options courantes de la commande gcc

OptionExplication
-ansiPrend uniquement en charge la syntaxe C de la norme ANSI. Cette option interdira certaines fonctionnalités de GNU C, telles que les mots-clés asm ou typeof.
-c Compiler et générer uniquement des fichiers objet.
-DMACRODéfinir la macro MACRO avec la chaîne "1".
-DMACRO=DEFNDéfinir la macro MACRO avec la chaîne "DEFN".
-E Exécuter uniquement le préprocesseur C.
-g Générer des informations de débogage. Le débogueur GNU peut utiliser ces informations.
-IDIRECTORY Spécifier un chemin de recherche supplémentaire pour les fichiers d'en-tête DIRECTORY.
-LDIRECTORYSpécifier un chemin de recherche supplémentaire pour les bibliothèques DIRECTORY.
-lLIBRARY Rechercher la bibliothèque spécifiée LIBRARY lors de l'édition de liens.
-m486 Optimiser le code pour le 486.
-o FILE Générer le fichier de sortie spécifié. Utilisé lors de la génération de fichiers exécutables.
-O0 Ne pas effectuer d'optimisation.
-O ou -O1Optimiser le code généré.
-O2 Optimiser davantage.
-O3 Optimiser au-delà de -O2, y compris les fonctions inline.
-shared Générer des fichiers objets partagés. Généralement utilisé lors de la construction de bibliothèques partagées.
-static Interdire la liaison partagée.
-UMACROAnnuler la définition de la macro MACRO.
-w Ne générer aucun message d'avertissement.
-Wall Générer tous les messages d'avertissement.