đ Retour au Sommaire
GCC (GNU Compiler Collection) est le compilateur C le plus utilisĂ© sous Linux. Par dĂ©faut, la commande gcc fichier.c compile votre programme avec des options par dĂ©faut, mais GCC offre des centaines dâoptions pour contrĂŽler finement le processus de compilation.
Dans cette section, nous allons découvrir les options essentielles que tout développeur C doit connaßtre. Ces options vous permettront de :
La syntaxe de base de GCC est :
gcc [options] fichier(s)_source -o nom_executable
Les options commencent gĂ©nĂ©ralement par - (un tiret) ou -- (deux tirets). Elles peuvent ĂȘtre combinĂ©es dans nâimporte quel ordre.
# Ces deux commandes sont équivalentes
gcc -Wall -g hello.c -o hello
gcc hello.c -o hello -Wall -g
Ces options permettent dâarrĂȘter la compilation Ă une Ă©tape spĂ©cifique, comme nous lâavons vu dans les sections prĂ©cĂ©dentes.
| Option | Ătape finale | Fichier produit | Description |
|---|---|---|---|
-E |
Préprocesseur | .i |
ArrĂȘte aprĂšs le prĂ©traitement |
-S |
Compilation | .s |
Produit le code assembleur |
-c |
Assemblage | .o |
Produit le fichier objet |
| (aucune) | Ădition de liens | exĂ©cutable | Produit lâexĂ©cutable final |
-o : Nommer la SortieLâoption -o (output) permet de spĂ©cifier le nom du fichier de sortie :
# Sans -o : l'exécutable s'appelle "a.out" par défaut
gcc hello.c
./a.out
# Avec -o : on choisit le nom
gcc hello.c -o hello
./hello
# Fonctionne à toutes les étapes
gcc -E hello.c -o hello.i
gcc -S hello.c -o hello.s
gcc -c hello.c -o hello.o
Conseil : Utilisez toujours -o pour donner un nom explicite à vos exécutables.
Les warnings sont des messages du compilateur qui signalent des problĂšmes potentiels dans votre code. Contrairement aux erreurs, ils nâempĂȘchent pas la compilation, mais il ne faut jamais les ignorer.
-Wall : Activer les Warnings CourantsCâest lâoption la plus importante. Elle active un ensemble de warnings trĂšs utiles :
gcc -Wall hello.c -o hello
Ce que -Wall détecte :
Exemple :
// programme.c
#include <stdio.h>
int main(void) {
int x; // Variable déclarée mais non utilisée
printf("Hello");
// Pas de return (problĂšme !)
}
gcc -Wall programme.c -o programme
# Warnings affichés :
# warning: unused variable 'x'
# warning: control reaches end of non-void function
-Wextra : Warnings SupplémentairesActive des warnings additionnels non inclus dans -Wall :
gcc -Wall -Wextra hello.c -o hello
Warnings supplémentaires :
-Werror : Transformer les Warnings en ErreursCette option bloque la compilation si un warning est émis :
gcc -Wall -Werror hello.c -o hello
Pourquoi utiliser -Werror ?
-Wpedantic : ConformitĂ© Stricte au StandardĂmet des warnings pour tout code non conforme au standard C choisi :
gcc -Wall -Wpedantic -std=c11 hello.c -o hello
-Wconversion : Conversions ImplicitesAvertit lors de conversions qui peuvent perdre des données :
gcc -Wall -Wconversion hello.c -o hello
int x = 1000;
char c = x; // Warning : perte potentielle de données
gcc -Wall -Wextra -Werror hello.c -o hello
Cette combinaison vous force à écrire du code propre dÚs le départ.
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â NIVEAUX DE WARNINGS GCC â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â â
â (aucun) Warnings minimaux (dangereux !) â
â â â
â ⌠â
â -Wall Warnings courants (minimum recommandĂ©) â
â â âââ Variables non utilisĂ©es â
â â âââ Fonctions implicites â
â â âââ ProblĂšmes de format printf/scanf â
â ⌠â
â -Wextra Warnings supplĂ©mentaires â
â â âââ ParamĂštres non utilisĂ©s â
â â âââ Comparaisons signĂ©/non-signĂ© â
â ⌠â
â -Wpedantic ConformitĂ© stricte au standard â
â â âââ Extensions GCC non standard â
â ⌠â
â -Werror Tous les warnings deviennent des erreurs â
â âââ Compilation bloquĂ©e au moindre warning â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Ces options ajoutent des informations dans lâexĂ©cutable pour faciliter le dĂ©bogage avec des outils comme GDB.
-g : Informations de DébogageAjoute les informations nécessaires pour déboguer avec GDB :
gcc -g hello.c -o hello
Ce que -g ajoute :
Sans -g, GDB est quasi inutilisable :
# Sans -g
gcc hello.c -o hello
gdb ./hello
# (gdb) break main
# No symbol table is loaded. Use the "file" command.
# Avec -g
gcc -g hello.c -o hello
gdb ./hello
# (gdb) break main
# Breakpoint 1 at 0x1149: file hello.c, line 5.
-ggdb : Informations Optimisées pour GDBProduit des informations de débogage au format le plus expressif pour GDB :
gcc -ggdb hello.c -o hello
-g3 : Informations de Débogage MaximalesInclut les informations sur les macros (utile pour déboguer du code avec beaucoup de #define) :
gcc -g3 hello.c -o hello
| Option | Niveau | Description |
|---|---|---|
-g0 |
Aucun | Pas dâinfo de dĂ©bogage |
-g1 |
Minimal | Info basique (backtrace) |
-g ou -g2 |
Standard | Info complÚte (recommandé) |
-g3 |
Maximum | Info + macros |
Pour le développement, utilisez :
gcc -g -Wall -Wextra hello.c -o hello
GCC peut optimiser votre code pour le rendre plus rapide ou plus compact. Les optimisations sont désactivées par défaut.
| Option | Niveau | Description |
|---|---|---|
-O0 |
Aucun | Pas dâoptimisation (dĂ©faut) |
-O1 |
Basique | Optimisations rapides et sûres |
-O2 |
Standard | Bon équilibre vitesse/taille |
-O3 |
Agressif | Maximum de vitesse |
-Os |
Taille | Optimise pour la taille |
-Ofast |
ExtrĂȘme | -O3 + optimisations non conformes |
-O0 : Aucune Optimisationgcc -O0 hello.c -o hello
-O1 : Optimisation Basiquegcc -O1 hello.c -o hello
-O2 : Optimisation Standardgcc -O2 hello.c -o hello
-O3 : Optimisation Agressivegcc -O3 hello.c -o hello
-O2-Os : Optimisation pour la Taillegcc -Os hello.c -o hello
-O2 mais Ă©vite les optimisations qui augmentent la taille-Ofast : Optimisation ExtrĂȘmegcc -Ofast hello.c -o hello
-O3 plus des optimisations non conformes au standardâââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â NIVEAUX D'OPTIMISATION â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â â
â Performance â
â âČ â
â â -Ofast â â
â â (non standard) â
â â â
â â -O3 â â
â â (agressif) â
â â â
â â -O2 â â
â â (production) â
â â â
â â -O1 â â
â â (basique) â
â â â
â â -O0 â â
â â (debug) â
â â â
â ââââââââââââââââââââââââââââââââââââââââââââââââ¶ â
â Temps de compilation â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Les optimisations peuvent réorganiser ou supprimer du code, ce qui rend le débogage difficile :
# Pour le développement (débogage facile)
gcc -g -O0 hello.c -o hello
# Pour la production (performance)
gcc -O2 hello.c -o hello
# Compromis (débogage possible avec optimisations)
gcc -g -Og hello.c -o hello # -Og = optimisé pour le débogage
Le langage C a évolué au fil des années. GCC supporte plusieurs versions du standard.
| Option | Standard | Année | Description |
|---|---|---|---|
-std=c89 ou -ansi |
ANSI C | 1989 | Le C original standardisé |
-std=c99 |
C99 | 1999 | Ajout de //, bool, VLA⊠|
-std=c11 |
C11 | 2011 | Threads, atomiques, _Generic |
-std=c17 |
C17 | 2017 | Corrections de C11 |
-std=c23 |
C23 | 2024 | DerniĂšre version (ISO/IEC 9899:2024) |
-std=gnu11 |
GNU C11 | - | C11 + extensions GNU |
# Compiler en C99
gcc -std=c99 hello.c -o hello
# Compiler en C11 (recommandé)
gcc -std=c11 hello.c -o hello
# Compiler en C11 avec extensions GNU (défaut de GCC)
gcc -std=gnu11 hello.c -o hello
Certaines fonctionnalitĂ©s nâexistent que dans certains standards :
// Commentaires // : C99+
// Ce commentaire ne compile pas en C89
// Déclaration de variable au milieu du code : C99+
for (int i = 0; i < 10; i++) { // 'int i' dans le for : C99+
// ...
}
// Booléens natifs : C99+ (avec stdbool.h)
#include <stdbool.h>
bool flag = true;
Pour un nouveau projet en 2025 :
gcc -std=c11 -Wall -Wextra hello.c -o hello
C11 offre un bon équilibre entre fonctionnalités modernes et compatibilité.
Ces options indiquent Ă GCC oĂč trouver les fichiers dâen-tĂȘte et les bibliothĂšques.
-I : Chemin des Fichiers dâEn-tĂȘteAjoute un rĂ©pertoire oĂč chercher les fichiers .h :
gcc -I./include hello.c -o hello
Structure de projet typique :
mon_projet/
âââ include/
â âââ utils.h
âââ src/
â âââ main.c
âââ Makefile
gcc -I./include src/main.c -o programme
Vous pouvez spécifier plusieurs répertoires :
gcc -I./include -I./libs/include hello.c -o hello
-L : Chemin des BibliothĂšquesAjoute un rĂ©pertoire oĂč chercher les bibliothĂšques (.a, .so) :
gcc -L./lib hello.c -o hello -lmalib
-l : Lier une BibliothĂšqueLie votre programme avec une bibliothĂšque :
# Lier avec la bibliothÚque mathématique (libm.so)
gcc hello.c -o hello -lm
# Lier avec pthread
gcc hello.c -o hello -pthread
Convention de nommage :
libXXX.so se lie avec -lXXXlibm.so â -lmNote sur pthread : Utilisez le flag -pthread (et non -lpthread) pour les threads POSIX. Le flag -pthread configure Ă la fois le compilateur (defines prĂ©processeur comme _REENTRANT) et le linker, ce qui est plus fiable que -lpthread seul.
gcc -I./include -L./lib src/main.c -o programme -lutils -lm
Cette commande :
.h dans ./include./libsrc/main.clibutils et libmCes options contrÎlent le comportement du préprocesseur.
-D : Définir une MacroDéfinit une macro comme si vous aviez écrit #define dans le code :
# Ăquivalent Ă #define DEBUG
gcc -DDEBUG hello.c -o hello
# Ăquivalent Ă #define VERSION 2
gcc -DVERSION=2 hello.c -o hello
Utilisation typique pour le débogage conditionnel :
#include <stdio.h>
int main(void) {
#ifdef DEBUG
printf("Mode debug activé\n");
#endif
printf("Programme principal\n");
return 0;
}
# Sans DEBUG
gcc hello.c -o hello
./hello
# Affiche : Programme principal
# Avec DEBUG
gcc -DDEBUG hello.c -o hello
./hello
# Affiche : Mode debug activé
# Programme principal
-U : Supprimer une MacroSupprime une macro prédéfinie :
gcc -UDEBUG hello.c -o hello
-include : Inclure un FichierForce lâinclusion dâun fichier au dĂ©but de chaque source :
gcc -include config.h hello.c -o hello
Ăquivalent Ă ajouter #include "config.h" au dĂ©but de hello.c.
-v : Mode VerbeuxAffiche toutes les commandes exécutées par GCC :
gcc -v hello.c -o hello
Utile pour diagnostiquer des problĂšmes de compilation.
-save-temps : Conserver les Fichiers IntermédiairesGarde les fichiers .i, .s et .o :
gcc -save-temps hello.c -o hello
ls
# hello hello.c hello.i hello.o hello.s
-### : Afficher sans ExécuterAffiche les commandes qui seraient exécutées, sans les exécuter :
gcc -### hello.c -o hello
-M et -MM : Générer les DépendancesAffiche les dépendances du fichier (utile pour les Makefiles) :
gcc -M hello.c # Toutes les dépendances
gcc -MM hello.c # Sans les en-tĂȘtes systĂšme
--version : Afficher la Versiongcc --version
# gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
--help : Afficher lâAidegcc --help
gcc --help=warnings # Aide sur les warnings
gcc --help=optimizers # Aide sur les optimisations
gcc -g -O0 -Wall -Wextra -std=c11 source.c -o programme
-g : Informations de dĂ©bogage-O0 : Pas dâoptimisation (code prĂ©visible)-Wall -Wextra : Maximum de warnings-std=c11 : Standard modernegcc -O2 -Wall -Wextra -Werror -std=c11 source.c -o programme
-O2 : Optimisations standard-Werror : Aucun warning toléré-g (sauf si vous voulez déboguer en production)gcc -g -O0 -Wall -Wextra -Wpedantic -Werror -std=c11 source.c -o programme
-Wpedantic : Conformité stricte au standard-Werror : Zéro tolérance aux problÚmesgcc -g -Wall -Wextra -Werror -std=c11 \
-I./include \
-L./lib \
src/main.c src/utils.c \
-o programme \
-lm -pthread
| Option | Catégorie | Description |
|---|---|---|
-o |
Sortie | Nom du fichier de sortie |
-E |
Pipeline | ArrĂȘte aprĂšs le prĂ©processeur |
-S |
Pipeline | ArrĂȘte aprĂšs la compilation (assembleur) |
-c |
Pipeline | ArrĂȘte aprĂšs lâassemblage (objet) |
-Wall |
Warnings | Warnings courants |
-Wextra |
Warnings | Warnings supplémentaires |
-Werror |
Warnings | Warnings â erreurs |
-Wpedantic |
Warnings | Conformité stricte |
-g |
Débogage | Infos de débogage |
-O0 |
Optimisation | Aucune |
-O2 |
Optimisation | Standard (production) |
-O3 |
Optimisation | Agressive |
-Os |
Optimisation | Taille minimale |
-std=c11 |
Standard | Utiliser C11 |
-I |
Chemins | Répertoire des headers |
-L |
Chemins | Répertoire des bibliothÚques |
-l |
Liaison | Lier une bibliothĂšque |
-D |
Préprocesseur | Définir une macro |
-v |
Divers | Mode verbeux |
-save-temps |
Divers | Garder fichiers intermédiaires |
Maßtriser les options de GCC est essentiel pour tout développeur C. En résumé :
-Wall (minimum absolu)-Wextra et -Werror pour du code propre-g pendant le développement-O2 pour la production-std=c11 pour un standard moderne et stableCommencez avec cette commande de base et ajustez selon vos besoins :
gcc -g -Wall -Wextra -std=c11 source.c -o programme
Dans les sections suivantes, nous verrons comment automatiser ces options avec des outils comme Make et CMake, pour ne plus avoir Ă les taper manuellement Ă chaque compilation.