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.

Synopsis
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

OptionEffet
-o fichiernomme l'exécutable ou le fichier produit
-Wall -Wextraactive les warnings utiles ; à mettre à chaque compilation
-Werrortransforme chaque warning en erreur, l'exécutable n'est pas produit
-ggarde les noms et les numéros de ligne pour gdb et Valgrind
-O0, -O2sans optimisation (le défaut, idéal pour déboguer), ou optimisé
-std=c17, -std=c23choisit la version du langage
-ccompile sans éditer les liens et produit un .o
-I dossierajoute un dossier où chercher les en-têtes
-L dossierajoute un dossier où chercher les bibliothèques
-lnomlie la bibliothèque libnom, par exemple -lm pour les fonctions de <math.h>
-fsanitize=addressajoute 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 :

Terminal
$ 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.0

Sé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à :

Terminal
$ 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 un return oublié ou un = à la place de ==. Les messages les plus courants sont traduits dans warnings GCC expliqués.

  • Les -l se placent après les fichiers qui en ont besoin : l'éditeur de liens lit la commande de gauche à droite. L'erreur typique est undefined reference to `sqrt', détaillée dans undefined reference to.

  • -g avec -O2 produit 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éclarations f()). Voir GCC 15 et C23 par défaut.

  • -fsanitize=address a besoin de la bibliothèque libasan, absente de l'image Alpine des exercices Grademe : l'édition de liens y échoue sur cannot find -lasan. Valgrind, lui, y est installé.

C

fix-the-warnings

Corrige les trois avertissements que -Wextra -Werror transforme en erreurs dans clamp.c, puis écris la branche qui manque à clamp.

Ouvrir l'exercice

À toi d'écrire le code.