GCC Compiler est un compilateur C très puissant et populaire pour diverses distributions Linux. Cet article explique certaines des options populaires du compilateur GCC.
Un exemple de code C
Le code C de base suivant (main.c) sera utilisé dans cet article :
#include<stdio.h> int main(void) { printf("\n The Geek Stuff\n"); return 0; }
Options du compilateur GCC
1. Spécifiez le nom de l'exécutable de sortie
Dans sa forme la plus basique, le compilateur gcc peut être utilisé comme :
gcc main.c
La commande ci-dessus exécute le processus de compilation complet et génère un exécutable avec le nom a.out.
Utilisez l'option -o, comme indiqué ci-dessous, pour spécifier le nom du fichier de sortie pour l'exécutable.
gcc main.c -o main
La commande ci-dessus produirait un fichier de sortie avec le nom "main".
Pour comprendre le processus de compilation complet d'un compilateur GCC, lisez notre article Journey of a C Program to Linux Executable in 4 Stages.
2. Activer tous les avertissements définis via l'option -Wall
Cette option active tous les avertissements dans GCC.
#include<stdio.h> int main(void) { int i; printf("\n The Geek Stuff [%d]\n", i); return 0; }
Si le code ci-dessus est compilé, l'avertissement suivant lié à la variable i non initialisée est produit :
$ gcc -Wall main.c -o main main.c: In function ‘main’: main.c:6:10: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
3. Produire uniquement la sortie du préprocesseur avec l'option -E
La sortie de l'étape de prétraitement peut être produite à l'aide de l'option -E.
$ gcc -E main.c > main.i
La commande gcc produit la sortie sur stdout afin que vous puissiez rediriger la sortie dans n'importe quel fichier. Dans notre cas (ci-dessus), le fichier main.i contiendrait la sortie prétraitée.
4. Produire uniquement le code assembleur à l'aide de l'option -S
La sortie au niveau de l'assemblage peut être produite à l'aide de l'option -S.
gcc -S main.c > main.s
Dans ce cas, le fichier main.s contiendrait la sortie de l'assemblage.
5. Produire uniquement le code compilé en utilisant l'option -C
Pour produire uniquement le code compilé (sans aucune liaison), utilisez l'option -C.
gcc -C main.c
La commande ci-dessus produirait un fichier main.o qui contiendrait le code au niveau de la machine ou le code compilé.
6. Produire tous les fichiers intermédiaires à l'aide de la fonction -save-temps
L'option -save-temps peut faire tout le travail effectué dans les exemples 4,5 et 6 ci-dessus. Grâce à cette option, la sortie à toutes les étapes de la compilation est stockée dans le répertoire courant. Veuillez noter que cette option produit également l'exécutable.
Par exemple :
$ gcc -save-temps main.c $ ls a.out main.c main.i main.o main.s
On voit donc que tous les fichiers intermédiaires ainsi que l'exécutable final ont été produits en sortie.
7. Lien avec les bibliothèques partagées à l'aide de l'option -l
L'option -l peut être utilisée pour établir un lien avec des bibliothèques partagées. Par exemple :
gcc -Wall main.c -o main -lCPPfile
La commande gcc mentionnée ci-dessus relie le code main.c à la bibliothèque partagée libCPPfile.so pour produire l'exécutable final "main".
8. Créer un code indépendant de la position à l'aide de l'option -fPIC
Lors de la création des bibliothèques partagées, un code indépendant de la position doit être produit. Cela aide la bibliothèque partagée à être chargée comme n'importe quelle adresse au lieu d'une adresse fixe. Pour cela, l'option -fPIC est utilisée.
Par exemple, les commandes suivantes créent une bibliothèque partagée libCfile.so à partir du fichier source Cfile.c :
$ gcc -c -Wall -Werror -fPIC Cfile.c $ gcc -shared -o libCfile.so Cfile.o
Nous voyons donc que l'option -fPIC a été utilisée lors de la création d'une bibliothèque partagée.
9. Affiche toutes les commandes exécutées à l'aide de l'option -V
L'option -v peut être utilisée pour fournir des informations détaillées sur toutes les étapes suivies par gcc lors de la compilation d'un fichier source.
Par exemple :
$ gcc -Wall -v main.c -o main Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper Target: i686-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu Thread model: posix gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ... ... ...
Nous voyons donc que des informations détaillées ont été produites dans la sortie.
10. Activer la prise en charge des programmes ISO C89 à l'aide de l'option -ansi
Grâce à l'option -ansi, la prise en charge du style ISO C89 est activée.
Considérez le code suivant :
#include<stdio.h> int main(void) { // Print the string printf("\n The Geek Stuff\n"); return 0; }
Si le code ci-dessus est compilé avec l'option -ansi, gcc produirait une erreur car les commentaires C++ ne sont pas autorisés dans le style ISO C89.
Voici le résultat :
$ gcc -Wall -ansi main.c -o main main.c: In function ‘main’: main.c:5:3: error: expected expression before ‘/’ token
Nous voyons donc que gcc a généré une erreur liée au style de commentaire.
11. Interpréter le caractère comme un caractère non signé en utilisant l'option -funsigned-char
Grâce à cette option, le type char est traité comme un type non signé.
Voici un exemple :
#include<stdio.h> int main(void) { char c = -10; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
Lorsque le code ci-dessus est compilé avec l'option funsigned-char, voici la sortie :
$ gcc -Wall -funsigned-char main.c -o main $ ./main The Geek Stuff [246]
Nous voyons donc que le caractère a bien été traité comme non signé.
12. Interpréter le caractère comme un caractère signé en utilisant l'option -fsigned-char
C'est le contraire de ce que nous avons discuté dans (12) ci-dessus. En utilisant ce drapeau, les variables char sont traitées comme signées.
Voici un exemple :
$ gcc -Wall -fsigned-char main.c -o main $ ./main The Geek Stuff [-10]
La sortie confirme que char a été traité comme signé.
13. Utiliser les macros de compilation à l'aide de l'option -D
L'option de compilation D peut être utilisée pour définir des macros de compilation dans le code.
Voici un exemple :
#include<stdio.h> int main(void) { #ifdef MY_MACRO printf("\n Macro defined \n"); #endif char c = -10; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
L'option du compilateur -D peut être utilisée pour définir la macro MY_MACRO à partir de la ligne de commande.
$ gcc -Wall -DMY_MACRO main.c -o main $ ./main Macro defined The Geek Stuff [-10]
L'impression liée à la macro dans la sortie confirme que la macro a été définie.
14. Convertissez les avertissements en erreurs avec l'option -Werror
Grâce à cette option, tout avertissement que gcc pourrait signaler est converti en erreur.
Voici un exemple :
#include<stdio.h> int main(void) { char c; // Print the string printf("\n The Geek Stuff [%d]\n", c); return 0; }
La compilation du code ci-dessus devrait générer un avertissement lié à la variable indéfinie c et cela devrait être converti en erreur en utilisant l'option -Werror.
$ gcc -Wall -Werror main.c -o main main.c: In function ‘main’: main.c:7:10: error: ‘c’ is used uninitialized in this function [-Werror=uninitialized] cc1: all warnings being treated as errors
15. Fournir des options gcc via un fichier en utilisant l'option @
Les options de gcc peuvent également être fournies via un fichier. Cela peut être fait en utilisant l'option @ suivie du nom du fichier contenant les options. Plusieurs options sont séparées par un espace blanc.
Voici un exemple :
$ cat opt_file -Wall -omain
L'opt_file contient les options.
Compilez maintenant le code en fournissant opt_file avec l'option @.
$ gcc main.c @opt_file main.c: In function ‘main’: main.c:6:11: warning: ‘i’ is used uninitialized in this function [-Wuninitialized] $ ls main main
La sortie confirme que le fichier opt_file a été analysé pour obtenir les options et que la compilation a été effectuée en conséquence.