6.4. Syntaxe des outils de compilation

Il existe évidemment un grand nombre de compilateurs C/C++ pour chaque plate-forme. Ils ne sont malheureusement pas compatibles au niveau de la ligne de commande. Le même problème apparaît pour les éditeurs de liens (« linker » en anglais) et pour make. Cependant, quelques principes généraux peuvent être établis. Dans la suite, je supposerai que le nom du compilateur est « cc », que celui du préprocesseur est « cpp », celui de l'éditeur de liens est « ld » et que celui de make est « make ».

En général, les différentes étapes de la compilation et de l'édition de liens sont regroupées au niveau du compilateur, ce qui permet de faire les phases de traitement du préprocesseur, de compilation et d'édition de liens en une seule commande. Les lignes de commandes des compilateurs sont donc souvent compliquées et très peu portable. En revanche, la syntaxe de make est un peu plus portable.

6.4.1. Syntaxe des compilateurs

Le compilateur demande en général les noms des fichiers sources à compiler et les noms des fichiers objets à utiliser lors de la phase d'édition de liens. Lorsque l'on spécifie un fichier source, le compilateur utilisera le fichier objet qu'il aura créé pour ce fichier source en plus des fichiers objets donnés dans la ligne de commande. Le compilateur peut aussi accepter en ligne de commande le chemin de recherche des bibliothèques du langage et des fichiers d'en-tête. Enfin, différentes options d'optimisation sont disponibles (mais très peu portables). La syntaxe (simplifiée) des compilateurs est souvent la suivante :

cc [fichier.o [...]] [[-c] fichier.c [...]] [-o exécutable]
   [-Lchemin_bibliothèques] [-lbibliothèque [...]] [-Ichemin_include]
fichier.c est le nom du fichier à compiler. Si l'option -c le précède, le fichier sera compilé, mais l'éditeur de liens ne sera pas appelé. Si cette option n'est pas présente, l'éditeur de liens est appelé, et le programme exécutable formé est enregistré dans le fichier a.out. Pour donner un autre nom à ce programme, il faut utiliser l'option -o, suivie du nom de l'exécutable. Il est possible de donner le nom des fichiers objets déjà compilés (« fichier.o ») pour que l'éditeur de liens les lie avec le programme compilé.

L'option -L permet d'indiquer le chemin du répertoire des bibliothèques de fonctions prédéfinies. Ce répertoire sera ajouté à la liste des répertoires indiqués dans la variable d'environnement LIBRARY_PATH. L'option -l demande au compilateur d'utiliser la bibliothèque spécifiée, si elle ne fait pas partie des bibliothèques utilisées par défaut. De même, l'option -I permet de donner le chemin d'accès au répertoire des fichiers à inclure (lors de l'utilisation du préprocesseur). Les chemins ajoutés avec cette option viennent s'ajouter aux chemins indiqués dans les variables d'environnement C_INCLUDE_PATH et CPLUS_INCLUDE_PATH pour les programmes compilés respectivement en C et en C++.

L'ordre des paramètres sur la ligne de commande est significatif. La ligne de commande est exécutée de gauche à droite.

Exemple 6-1. Compilation d'un fichier et édition de liens

cc -c fichier1.c
cc fichier1.o programme.cc -o lancez_moi

Dans cet exemple, le fichier C fichier1.c est compilé en fichier1.o, puis le fichier C++ programme.cc est compilé et lié au fichier1.o pour former l'exécutable lancez_moi.

6.4.2. Syntaxe de make

La syntaxe de make est très simple :

make

En revanche, la syntaxe du fichier makefile est un peu plus compliquée et peu portable. Cependant, les fonctionnalités de base sont gérées de la même manière par la plupart des programme make.

Le fichier makefile est constitué d'une série de lignes d'information et de lignes de commande (de l'interpréteur de commandes UNIX ou DOS). Les commandes doivent toujours être précédées d'un caractère de tabulation horizontale.

Les lignes d'information donnent des renseignements sur les dépendances des fichiers (en particulier, les fichiers objets qui doivent être utilisés pour créer l'exécutable). Les lignes d'information permettent donc à make d'identifier les fichiers sources à compiler afin de générer l'exécutable. Les lignes de commande indiquent comment effectuer cette compilation (et éventuellement d'autres tâches).

La syntaxe des lignes d'information est la suivante :

nom:dépendance
nom est le nom de la cible (généralement, il s'agit du nom du fichier destination), et dépendance est la liste des noms des fichiers dont dépend cette cible, séparés par des espaces. La syntaxe des lignes de commande utilisée est celle de l'interpréteur du système hôte. Enfin, les commentaires dans un fichier makefile se font avec le signe dièse (#).

Exemple 6-2. Fichier makefile sans dépendances

# Compilation du fichier fichier1.c :
	cc - c fichier1.c

# Compilation du programme principal :
	cc -o Lancez_moi fichier1.o programme.c

Exemple 6-3. Fichier makefile avec dépendances

# Indique les dépendances :
Lancez_moi: fichier1.o programme.o

# Indique comment compiler le programme :
# (le symbole $@ représente le nom de la cible, ici, Lancez_moi)
	cc -o $@ fichier1.o programme.o

#compile les dépendances :
fichier1.o: fichier1.c
	cc -c fichier1.c

programme.o: programme1.c
	cc -c programme.c