Un programme en langage C n'est pas directement compréhensible pour la machine sur laquelle vous travaillez. Il faut lui faire subir une transformation pour en faire un fichier exécutable. C'est la compilation.
La compilation se passe en trois étapes. La première transforme le
fichier source (d'extension .c
) en prenant en compte
toutes les instructions qui commencent par #
. Par exemple
l'instruction #include <stdio.h>
est remplacée par
le contenu du fichier stdio.h
de sorte que lors de la
phase suivante (la compilation proprement dite) les déclarations des
fonctions d'entrée-sortie soient prises en compte. La seconde étape
est la compilation du fichier source, c'est à dire la traduction du
langage C en langage que la machine comprend. Enfin la dernière étape
est le lien, qui consiste à ajouter au programme compilé les fonctions
déjà compilées que notre programme utilise (comme celles déclarées
dans les fichiers .h).
Dans la configuration que nous utilisons, l'utilisateur ne fait appel
qu'à un seul programme qui effectuera successivement toutes ces
opérations. Il s'agit du compilateur gcc
(pour GNU C Compiler).
C'est un logiciel libre
et distribué gratuitement de grande qualité. Il existe sur toutes
les machines UNIX (GNU/Linux et Apple entre autres basent leurs
systèmes dessus et sont donc distribués avec gcc
), mais
existe aussi pour Microsoft-Windows.
La commande de compilation est
ordi:~$ gcc -Wall pendule_euler.c -o pendule_euler
Par défaut le programme exécutable généré a pour nom
a.out
, mais il est conseillé de lui donner un autre nom
avec l'option -o
: dans l'exemple donné le programme
s'appellera pendule_euler
. L'option -Wall
sert à
générer le maximum d'avertissements lors de la compilation. Nous
conseillons vivement de toujours la mettre !
Si la compilation s'est terminée sans erreur, on peut exécuter le
programme en tapant son nom précédé de ./
, dans notre
exemple:
ordi:~$ ./pendule_euler
Le fichier exécutable (exemple: pendule_euler
) n'est créé (ou
modifié) que si la compilation s'est déroulée sans erreur.
Pour que la compilation se déroule correctement, il faut que le
fichier source (ici pendule_euler.c
) soit écrit sans
erreur de syntaxe. Si tel n'est pas le cas, le compilateur ne comprend
pas et vous indique les erreurs de syntaxe, et les numéros des lignes
où il a rencontré une erreur.
Il est essentiel de lire les messages d'erreur si l'on veut pouvoir les corriger !! Ceux-ci sont écrit en anglais mais il n'est pas nécessaire d'avoir un niveau exceptionnel pour les comprendre. Vous pouvez consulter une liste (non exhaustive) de messages d'erreur.
On rencontre deux types de messages, les erreurs (error) et les avertissements (warnings). Les erreurs sont "fatales" : le compilateur ne comprend pas et ne peut donc générer de fichier exécutable. Les 'warnings' n'empêchent pas la compilation mais sont susceptibles de provoquer une erreur ou un dysfonctionnement lors de l'exécution. Il est souvent utile d'essayer d'analyser la cause de ces 'warnings'.
La plupart des fonctions standard du C sont ajoutées au programme exécutable dans la phase de lien. Cependant, certaines fonctions nécessitent un ajout "manuel" lors de la commande de compilation. C'est le cas, par exemple, pour les fonctions mathématiques. Si le programme utilise des fonctions mathématiques, la commande de compilation sera:
ordi:~ $ gcc -Wall simul2.c -lm -o simul2
qui permet au compilateur, lors de la phase de lien, d'aller chercher dans la bibliothèque de fonctions mathématiques celles utilisées dans le programme simul2.c, et de l'ajouter au programme exécutable. Une bibliothèque de fonctions (library) est en fait un ensemble de fonctions, regroupées en général par thème (comme des fonctions mathématiques) et déjà compilées.
D'une façon générale, on peut "lier" au programme n'importe
quelle bibliothèque de fonctions en utilisant lors de la commande de
compilation l'option -l
(pour library) suivie du nom de
la bibliothèque (sans espace): -lnom_de_la_bibliotheque
.
dans notre cas, la bibliothèque de fonctions mathématiques s'appelle
m
(pour math...). On peut ajouter plusieurs bibliothèques
en ajoutant autant de fois l'option -l...
à la suite.
Il est également possible de compiler ensemble plusieurs fichiers
sources (d'extension .c
), à partir du moment où un seul
de ces fichiers contient une fonction main()
(qui est le
point d'entrée du programme résultant). Cela peut se faire de
plusieurs façons:
-c
ordi:~ $ gcc -Wall -c ex2.c ordi:~ $ gcc -Wall -c fonctions.cle compilateur génère alors un fichier ayant le même nom que le source, mais avec l'option
.o
(pour objet). Dans cet
exemple, les fichiers s'appelleront donc ex2.o
et
fonctions.o
gcc
:
ordi:~ $ gcc ex2.o fonctions.o -lm -o ex2.exe
ordi:~ $ gcc -Wall ex2.c fonctions.c -lm -o ex2.exe
ce qui donne le même résultat (les fichiers .o sont, dans
tous les cas, générés).