On rencontrera aussi #ifdef à la place de #if
defined(...) . La forme #if defined permet de combiner les
tests dans des expressions logiques comme #if (defined(DEBUG)
&& (__i386__ == 1)).
L'exemple précédent si les constantes (ou macros) sont
définies. Pour les définir, il existe plusieurs solutions
:
Certaines constantes sont prédéfinies par le compilateur. Elles servent généralement à identifier le compilateur, l'OS et le microprocesseur.
La compilation conditionnelle est fortement utilisée dans les programmes "open source" car ces programmes sont censés pouvoir être compilés dans différents environnements (LinuxPPC bien sûr, mais aussi les différents Unix des constructeurs, '*BSD', et d'autres) qui peuvent exister sur différentes plate-formes (Macintosh, Alpha, Sparc, SGI, ...).
Encore un petit mot sur les constantes. On les appelle aussi macros car on peut définir des choses comme ceci :
#define MAX(a,b) ((a) < (b) ? (b) : (a))
ce qui ressemble assez aux fonctions-formules du FORTRAN (mais je m'égare ... ;-). A chaque fois que le précompilateur va rencontrer la "fonction" MAX, il la remplacera par sa définition.
le compilateur sait que la fonction printf de la bibliothèque standard du C existe, mais il est incapable d'en incorporer le code à notre programme car il ne sait pas où le trouver. Il va l'indiquer comme référence à résoudre par l'éditeur de liens (qu'on appelle aussi link, linker ou link edit; effectuer l'édition de lien se dit aussi "linker"). L'éditeur de lien va scruter tous les fichiers (produits de compilation et bibliothèques) qu'on lui passe en paramètre pour y rechercher les références à résoudre laissées par le compilateur et va effectuer les liens nécessaires entre les références à résoudre et le code correspondant dans les bibliothèques. Une fois ce travail terminé, le code produit est directement exécutable par un ordinateur.
Le code des bibliothèques statiques est incorporé au programme que l'on compile lors de la phase d'édition de liens. Dans le cas des bibliothèques dynamiques, en revanche, l'éditeur de liens va indiquer dans le code exécutable du programme que telle fonction se trouve dans telle bibliothèque dynamique, et le code correspondant ne sera pas incorporé au programme. Les bibliothèques dynamiques existent sous MacOS. Ce sont les bibliothèques partagées (ou shared libraries en anglais).
Un fichier Make file est consitué de plusieurs paragraphes comme le suivant :
Dans la liste de dépendances, on trouve d'autres cibles et des fichiers.
Un Makefile minimal pourrait ressembler à ceci :
Dans ce fichier Makefile, on indique que l'on veut obtenir le fichier toto. On a précisé que ce fichier se fabrique à partir du fichier toto.o par la commande gcc toto.o -o toto (édition de liens). On a aussi spécifié que toto.o se fabrique à partir du fichier toto.c par l'action gcc -O2 -c toto.c (compilation). On a aussi donné deux autres cibles : clean pour nettoyer le répertoire de développement, et install pour recopier l'exécutable toto dans un répertoire particulier. On remarque sur cet exemple qu'une cible peut correspondre à un fichier, mais que ce n'est pas obligatoire.
Quand on passera la commande make, make lira le fichier Makefile et cherchera la cible all. Make va alors rechercher la cible toto, puisque l'on a indiqué qu'all consiste à faire toto. Si le fichier toto existe, make s'arrête. Sinon, make va rechercher la cible toto. On a indiqué que toto se fait à partir de toto.o. Si le fichier toto.o existe, make va effectuer l'opération gcc toto.o -o toto. Si le fichier toto.o n'existe pas, make va rechercher la cible toto.o et ainsi de suite. En fait, c'est un peu plus compliqué que ça, car make va comparer aussi les dates de dernière modification des fichiers. Ainsi, si les fichiers toto, toto.o et toto.c existent, et que toto.c est plus récent que toto.o, make refera toto.o, puis, comme toto.o sera plus récent que toto, make refera toto.
On peut indiquer à make, sur la ligne de commande, une cible à réaliser (make clean, make toto.o). On peut aussi préciser le nom du fichier Makefile (make -f toto.make).
Je vous invite à lire la documentation de make à http://www.gnu.org/software/make/manual/make.html.