Vous vous retrouvez avec un répertoire TutorialMakefile. Descendez-y.tar zxvf TutorialMakefile.tar.gz rm TutorialMakefile.tar.gz
cd TutorialMakefile ls
On va faire de la compilation séparée à la main, ce qui est un brin fastidieux.cd Partie1 ls
La signification des options est la suivante :g++ -c -g -I. Main.cc g++ -c -g -I. Bonjour.cc g++ -c -g -I. Ciao.cc
Faire ensuite ...
g++ C'est le compilateur -c Ne cherche pas à faire un exécutable, mais un exécutable partiel (un objet). -g Laisse trainer dans le code de l'exécutable partiel de quoi lui appliquer un débuggeur. -I<chemin> Ici, le chemin est ., d'où -I. Le chemin précisé est un endroit où se trouve des fichiers incluables par #include <...> (et non #include "..."). On peut mettre plusieurs fois -I<chemin> si on a des .hh dans différents répertoires. <nom>.cc Le fichier à compiler. Il sera transformé automatiquement en .o (et non a.out).
... pour vérifier que tout y est. Il existe sur le disque des fichiers .o prets à l'emploi, déjà compilés par d'autres personnes (/usr/lib/... /usr/local/lib/... et d'autres). C'est ce qu'on appelle des bibliothèques (bibliothèques pour les fonctions d'entrée sortie, pour le graphisme, etc...)ls *.o
La signification des options est la suivante :g++ -o coup_de_vent Main.o Bonjour.o Ciao.o
Pour les bibliothèques usuelles, -L... est inutile. Dans cet exemple, c'est g++ qui se charge du linkage, mais il appelle en fait le linker ld. Quand il y a des problèmes au linkage, les messages sont donc du genre : ld: you have done n'importe quoi, play again
-o <nom> Appelle l'exécutable <nom> au lieu de l'arride a.out. -L<chemin> Désigne un chemin ou se trouve des bibliothèques. C'est analogue au -I pour les fichiers .hh -l<nom_bibliothèque> Désigne les bibliothèques à linker : exemple: pour ajouter libm.so qui contient les fonctions mathématiques définies dans 'math.h', on écrit -lm (et -lX pour libX.so).
./coup_de_vent Robert
... on y trouve les mêmes fichiers, ainsi qu'un makefile bien commenté. Lire tout le makefile. Tapezcd ../Partie2 ls
(pour faire la première cible : coup_de_vent). Vérifiez que tout a marché (tous les .o et l'exécutable coup_de_vent). Tapez encoremake
... il ne refait que le linkage, tout n'est pas recompilé. Tapezmake
pour faire comme si il venait d'être modifié (touch positionne la date du fichier à la date actuelle) Tapeztouch Bonjour.cc
... pratique non ? Tapezmake
... il ne se passe rien (que le linkage)... alors qu'il aurait été bon que si. En effet, en éditant Bonjour.cc et Main.cc, on constate que ces deux fichiers incluent (#include ...) Bonjour.hh. Il aurait fallu rajouter Bonjour.hh comme dépendance de Bonjour.cc, mais aussi de Main.cc !!!touch Bonjour.hh make
pour ne garder que les sources.make clear
Lire le makefile. C'est presque le même, si ce n'est qu'on ajoute une cible 'depend'. Vous n'êtes pas obligé de comprendre finement le comportement de makedepend, retenez ceci : avec ce makefile, il faut tapercd ../Partie3
pour activer une cible qui appelle le programme makedepend. Par curiosité, regardez le contenu du fichier 'makefile_depend',make depend
Il contient des cibles crées automatiquement par makedepend pour gérer les dépendances entre les sources .cc et les .hh qu'elles incluent. Tapezless makefile_depend
... les fichiers Main.o et Bonjour.o sont bien recompilés !!!make touch Bonjour.hh make