Compilation
En gros, la compilation est le processus qui prend un ou plusieurs fichiers sources et produit un exécutable. En fait, comme on le verra, c'est une synecdoque particularisante (figure de style où on parle du tout en utilisant un terme pour une partie seulement). Pour éviter cette figure de style malheureuse, on peut parler de génération d'un exécutable (build en anglais).
Préprocessing
En C, les mots-clés commençant par un #
correspondent à un traitement de préprocessing. Par exemple #define X 32
remplace les occurrences de X
par 32
.
#define X 32
int main() {
int a = X + 2;
int b = X;
}
devient
int main() {
int a = 32 + 2;
int b = 32;
}int x
La ligne #include "bloup.h"
insère le contenu du fichier bloup.h
:
#include "bloup.h"
int main() {
bloup_create();
bloup_inform(3);
}
devient
void bloup_create();
void bloup_inform(int x);
void bloup_extract(int x, int y);
void bloup_free();
int main() {
bloup_create();
bloup_inform(3);
}
Pour n'exécuter QUE le préprocesseur, il faut utiliser l'option -E
:
gcc -E main.c -o mainresultat.c
Compiler le projet en un coup
Voici une commande pour construire un exécutable :
gcc myotherCfile.c main.c -o main -Wall
où le flag -o
veut dire output.
- Quel défaut y-a-t-il de compiler tout ?
Compiler un projet fichier par fichier
En fait, on peut compiler chaque fichier source séparemment puis tout lier à la fin :
gcc -c -o myotherCfile.o myotherCfile.c
gcc -c -o main.o main.c
gcc -o main main.o myotherCfile.o
où le flag -c
signifie que l'on ne fait compiler mais pas lier.
Comme le montre l'image ci-dessous :
- la compilation consiste à transformer un fichier source .c en fichier objet (du code machine) .o mais en laissant des "trous" pour les fonctions qui sont définis dans d'autres modules.
- la liaison vient remplir les trous avec le code machine manquant.
Chaîne de compilation
C Source Code
|
v
+----------------+
| Preprocessor |
+----------------+
|
v
+----------------+
| Compiler |
+----------------+
|
v
+----------------+
| Linker |
+----------------+
|
v
Executable