GCC (GNU Compiler Collection)

GCC est un compilateur développé par le projet GNU. Il permet de traduire du code source écrit en langage C (et d’autres langages) en code machine exécutable par un ordinateur. Il est libre, open source et largement utilisé dans les systèmes Unix/Linux.

GNU (GNU’s Not Unix)

GNU est un projet lancé en 1983 par Richard Stallman dans le but de créer un système d’exploitation libre, compatible avec Unix, mais composé uniquement de logiciels libres.

🔁 Pourquoi « GNU’s Not Unix » ?

Le nom GNU est un acronyme récursif (un jeu de mots) qui signifie « GNU’s Not Unix » — autrement dit, « GNU n’est pas Unix ». Cela montre que le projet s’inspire de Unix mais n’en utilise aucun composant propriétaire.

🔧 Objectif du projet GNU :

Créer un système d’exploitation complet 100 % libre, comprenant :

  • Un noyau (à l’origine : Hurd, mais plus souvent associé au noyau Linux)
  • Un compilateur (GCC)
  • Un éditeur de texte (Emacs)
  • Un shell (Bash)
  • Des bibliothèques système (glibc), etc.

🔑 Valeurs fondamentales :

  • Liberté d’utiliser le logiciel
  • Liberté d’étudier le fonctionnement du logiciel
  • Liberté de modifier le logiciel
  • Liberté de partager le logiciel

Ces libertés sont à la base de la licence GNU GPL (General Public License), qui garantit que les logiciels restent libres.


🧠 À retenir :

  • GNU est le socle de nombreux systèmes d’exploitation appelés à tort « Linux » — le nom plus exact serait GNU/Linux (le système GNU utilisant le noyau Linux).
  • GCC, que tu m’as demandé plus tôt, fait partie du projet GNU.

Souhaites-tu que je t’explique aussi la différence entre GNU, Linux, et GNU/Linux ?

usage de gcc

gcc source.c -o executable

man gcc

GCC(1)                                GNU                               GCC(1)

NAME
       gcc - GNU project C and C++ compiler

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-Wpedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...

       Only the most useful options are listed here; see below for the
       remainder.  g++ accepts mostly the same options as gcc.

DESCRIPTION
       When you invoke GCC, it normally does preprocessing, compilation,
       assembly and linking.  The "overall options" allow you to stop this
       process at an intermediate stage.  For example, the -c option says not
       to run the linker.  Then the output consists of object files output by
       the assembler.
 Manual page gcc(1) line 1 (press h for help or q to quit)

Utilisation

Exemple avec un le code bonjour le monde !

fichier : bonjour.c

/********************************
 * Projet : Bonjour le monde !
 * Auteur : Leprof
 * Date   : 04/06/2025
 ********************************/
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char **argv)
{
	printf ("Bonjour le monde \n");

	return EXIT_SUCCESS;
}

En vert

c’est du commentaire , mais on ne cessera pas de dire même si fonctionnellement c’est effectivement non nécessaire , humainement c’est important même les IA nous en mettent ! Ici les données de base du code … /* et */

En orange

Sous Linux, les librairies système en C sont représentées par des fichiers d’en-tête (.h), situés dans des répertoires comme /usr/include.
Ces fichiers définissent :

  • des interfaces de programmation (API)
  • des macros
  • et des types utilisés par les fonctions du système

Par exemple :

  • stdlib.h déclare des fonctions utilitaires (comme malloc, exit) et des macros (EXIT_SUCCESS, EXIT_FAILURE)
  • stdio.h contient les déclarations nécessaires pour les opérations d’entrée/sortie standard (printf, scanf, etc.)

En bleu

la fonction minimale du code c , main()

gcc bonjour.c -o bonjour 

l’option -o permet de passer le nom du fichier de sortie (o comme output)

on peut voir d’autres syntaxe :

gcc -o bonjour bonjour.c  #fonctionne également

Et parfois si on doit juste tester un code le fichier de sortie peut être omis, mais ça n’est pas conseillé !

gcc bonjour.c
# le fichier de sortie sera a.out par defaut

Erreur de compilation

/********************************
 * Projet :
 * Auteur :
 * Date   :
 ********************************/
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char **argv)
{
	oprintf ("Bonjour le monde \n"); /* erreur oprintf  au lieu de printf */
	return EXIT_SUCCESS;
}
bruno@elliott:~/Works/langage_C/projet$ gcc -o projet projet.c 
projet.c: In function ‘main’:
projet.c:11:9: warning: implicit declaration of function ‘oprintf’; did you mean ‘dprintf’? [-Wimplicit-function-declaration]
   11 |         oprintf("Bonjour le monde \n");
      |         ^~~~~~~
      |         dprintf
/usr/bin/ld : /tmp/ccKAUOBK.o : dans la fonction « main » :
projet.c:(.text+0x1f) : référence indéfinie vers « oprintf »
collect2: error: ld returned 1 exit status

Ligne 11 caractère en position 9 il y a une erreur , gcc vous propose même une solution possible mais la c’est non.

Les messages d’erreur de gcc sont de plus en plus précis.

Les options de compilations

-lc

permet de faire les liens des librairies standards (libc.so ou libc.a) , option par défaut (on peut ne pas la mettre c’est par défaut)

-Wall

🔔 Option -Wall dans gcc

L’option -Wall signifie « Warn All » (afficher tous les avertissements courants).
Elle active un grand nombre de messages d’avertissement lors de la compilation pour t’aider à détecter :

  • des erreurs potentielles
  • des mauvaises pratiques
  • du code ambigu ou non portable

Tu peux aller plus loin avec :

  • -Wextra : encore plus d’avertissements
  • -Werror : transforme les avertissements en erreurs (le code ne compile pas si un warning apparaît)

🔔 Option -ansi

Active la compatibilité ANSI C (C89/C90)

Désactive certains éléments non standards, notamment :

  • les extensions GNU au langage C (ex : typeof, certains attributs spécifiques, etc.)
  • certains mots-clés comme asm, typeof, inline (sauf si tu actives -std=gnu89)

Rend le compilateur plus strict : utile pour écrire du code portable, conforme aux standards classiques

📘 ANSI : American National Standards Institute

ANSI est l’abréviation de American National Standards Institute, c’est-à-dire l’Institut national américain de normalisation.

Je vous conseille fortement d’utiliser les options -Wall et -ansi lors de la compilation avec gcc.

  • -Wall : active les avertissements courants. Cela vous aide à repérer très tôt des erreurs de logique, des oublis, ou des pratiques dangereuses — même si le code compile.
  • -ansi : force le compilateur à respecter le langage C standard (ANSI C), sans extensions spécifiques à GCC. Cela rend votre code plus portable, plus propre, et conforme aux bonnes pratiques.
gcc -lc -Wall -ansi mon_programme.c -o mon_programme

Les étapes de compilation / pré processing / assemblage et édition des liens

┌───────────────┐
│  Code source  │  (.c)
└──────┬────────┘
       │
       │ Préprocessing (gcc -E)
       ▼
┌───────────────┐
│  Code prépro  │  (.i)
└──────┬────────┘
       │
       │ Compilation (gcc -S)
       ▼
┌───────────────┐
│Code assembleur│  (.s)
└──────┬────────┘
       │
       │ Assemblage (gcc -c)
       ▼
┌───────────────┐
│  Code objet   │  (.o)
└──────┬────────┘
       │
       │ 'Linkage' (gcc)
       ▼
┌───────────────┐
│  Exécutable   │  (a.out ou autre si -o autre :)
└───────────────┘

🔔 Option -g

Ajoute les sondes logiciels pour débugger le code

pour que le code machine obtenu soit utilisable avec gdb , debugger

-static

Force le code à être statique (mis dans le code) par exemple libc.a au lieu d’utiliser libc.so , le code obtenu sera plus gros mais indépendant de la librairie dynamique .so