gcc(1)
Outil de développement
Le compilateur GNU : compiler et lier un programme C, activer les warnings, garder les informations de débogage, choisir la norme, lier une bibliothèque.
gcc [options] fichier.c... [-o sortie]Description
gcc transforme tes fichiers .c en exécutable. Derrière une seule commande, il enchaîne le préprocesseur, la compilation, l'assemblage et l'édition de liens. Sans option, il compile en silence ou presque, sans optimisation, dans le dialecte par défaut de sa version (gnu23 depuis GCC 15), et nomme le résultat a.out. Les options servent à le rendre bavard sur les erreurs probables et à préparer le débogage.
Options essentielles
| Option | Effet |
|---|---|
-o fichier | nomme l'exécutable ou le fichier produit |
-Wall -Wextra | active les warnings utiles ; à mettre à chaque compilation |
-Werror | transforme chaque warning en erreur, l'exécutable n'est pas produit |
-g | garde les noms et les numéros de ligne pour gdb et Valgrind |
-O0, -O2 | sans optimisation (le défaut, idéal pour déboguer), ou optimisé |
-std=c17, -std=c23 | choisit la version du langage |
-c | compile sans éditer les liens et produit un .o |
-I dossier | ajoute un dossier où chercher les en-têtes |
-L dossier | ajoute un dossier où chercher les bibliothèques |
-lnom | lie la bibliothèque libnom, par exemple -lm pour les fonctions de <math.h> |
-fsanitize=address | ajoute AddressSanitizer, qui arrête le programme au premier accès mémoire invalide |
Exemple
Un programme en deux fichiers, l'en-tête rangé dans include/. On compile chaque .c séparément, puis on lie les deux fichiers objets avec la bibliothèque mathématique :
$ gcc -Wall -Wextra -Werror -g -Iinclude -c geo.c -o geo.o$ gcc -Wall -Wextra -Werror -g -Iinclude -c main.c -o main.o$ gcc main.o geo.o -o distance -lm$ ./distance5.0Séparer -c et l'édition de liens permet de ne recompiler que le fichier modifié, c'est ce que fait make. Pour un petit programme, une seule commande suffit : gcc -Wall -Wextra -g -Iinclude main.c geo.c -o distance -lm.
Sans -Iinclude, le préprocesseur ne trouve pas l'en-tête et tout s'arrête là :
$ gcc -Wall -Wextra -g -c main.c -o main.omain.c:2:10: fatal error: geo.h: No such file or directory 2 | #include "geo.h" | ^~~~~~~compilation terminated.Pièges
Sans
-Wall -Wextra, gcc laisse passer unreturnoublié ou un=à la place de==. Les messages les plus courants sont traduits dans warnings GCC expliqués.Les
-lse placent après les fichiers qui en ont besoin : l'éditeur de liens lit la commande de gauche à droite. L'erreur typique estundefined reference to `sqrt', détaillée dans undefined reference to.-gavec-O2produit un binaire où certaines variables apparaissent<optimized out>dans gdb. Débogue en-O0.À l'inverse, certains warnings, comme une variable lue sans avoir été initialisée, n'apparaissent qu'avec
-O2. Compile de temps en temps avec les deux.GCC 15 compile en C23 par défaut, ce qui casse du code ancien (
typedef int bool;, déclarationsf()). Voir GCC 15 et C23 par défaut.-fsanitize=addressa besoin de la bibliothèquelibasan, absente de l'image Alpine des exercices Grademe : l'édition de liens y échoue surcannot find -lasan. Valgrind, lui, y est installé.
fix-the-warnings
Corrige les trois avertissements que -Wextra -Werror transforme en erreurs dans clamp.c, puis écris la branche qui manque à clamp.