wget http://cria2.uqam.ca/INF3105/lab1/lab1.zip unzip lab1.zip
Tapez les commandes suivantes :
$ g++ lab1.cpp $ ls $ ./a.out $ rm a.out $ g++ -o lab1 lab1.cpp $ ls $ ./lab1
A. Éditez lab1.cpp :
B. Tapez la commande :
$ g++ -o lab1 lab1.cpp
C. Que se passe-t-il ?
D. Essayer de comprendre les messages d'erreurs.
E. Faites les commandes :
$ g++ -o lab1 lab1.cpp point.cpp $ ls $ ./lab1
F. Que se passe-t-il ?
G. Faites les commandes :
$ g++ -c lab1.cpp $ ls $ g++ -c point.cpp $ ls $ g++ -o lab1 lab1.o point.o $ ls $ ./lab1
H. Que se passe-t-il ?
La compilation des travaux pratiques dans le cours se fait à l'aide d'un Makefile. Un fichier Makefile décrit comment construire (compiler) un projet avec la commande make. Pour le cours INF3105, vous n'avez pas besoin d'être un expert Makefile. Dans la plupart des cas, un fichier Makefile vous sera fourni et vous n'aurez pas à le modifier. Toutefois, il est souhaitable d'avoir une connaissance générale sur les Makefile. Le cours INF3135 ira plus en profondeur sur ce sujet.
A. Ouvrez le fichier Makefile dans l'éditeur et analysez-le. Ne le modifiez pas tout de suite.
OPTIONS = -g -O0 -Wall # Syntaxe : cible : dépendance1 dépendance2 ... # Ensuite, la ou les ligne(s) débutant par une tabulation (\t) donne les commandes pour construire une cible lab1: lab1.cpp g++ $(OPTIONS) -o lab1 lab1.cpp clean : rm -f *.o rm -f lab1 rm -f *~
B. Tapez la commande :
$ make
C. Que se passe-t-il ?
D. Éditez le fichier Makefile pour qu'il contienne :
#Option -g pour avoir les infos de débogage OPTIONS = -g -O0 -Wall #Option -O3 pour le code optimisé #OPTIONS = -O3 -Wall # Syntaxe : cible : dépendance1 dépendance2 ... # Ensuite, la ou les ligne(s) débutant par une tabulation (\t) donne les commandes pour construire une cible lab1: lab1.o point.o g++ $(OPTIONS) -o lab1 lab1.o point.o lab1.o: lab1.cpp g++ $(OPTIONS) -c -o lab1.o lab1.cpp point.o: point.cpp g++ $(OPTIONS) -c -o point.o point.cpp clean : rm -f *.o rm -f lab1Attention : si vous faites un copier-coller, remplacez les 5 blocs de 4 espaces (devant les commandes g++ et rm) par une tabulation (caractère '\t'). Le programme make reconnaît les commandes par les tabulations.
E. Tapez les commandes :
$ make clean $ make $ make
F. Que se passe-t-il ?
make clean ls make ls ./lab1
make # ne faites pas make clean avant ./lab1
make clean make ./lab1
... point.o: point.cpp point.h g++ $(OPTIONS) -c -o point.o point.cpp ...
1. Modifiez lab1.cpp : renommez main() en main2(), décommentez main3() et renommez main3() en main().
2. Faites les commandes :
make ./lab1
3. Notez le résultat affiché. Est-il conforme au programme? (oui).
4. Ajoutez une variable a dans la classe Point entre x et y :
//private: // ne pas décommenter tout de suite double x; double a; double y;
5. Faites la commande make. Ne faites pas make clean.
6. Quels fichiers ont été recompilés?
7. Faites la commande ./lab1 et comparez le résultat avec l'étape 3.
8. Que se passe-t-il? Est-ce que le résultat est bon?
Tentez d'expliquer pourquoi.
9. Éditez le fichier Makefile pour ajouter point.h
dans les dépendances de lab1.o :
lab1.o: lab1.cpp point.h g++ $(OPTIONS) -c -o lab1.o lab1.cpp
10. Faites la commande make.
Vous venez de régler un deuxième problème de dépendance. Il est important de comprendre que make ne fait que lire les dépendances qui lui sont spécifiées. Make ne les détecte pas automatiquement en analysant les sources. C'est celui qui écrit ou qui génère le fichier Makefile qui doit penser aux dépendances!
Heureusement, il y a des outils pour considérer les dépendances. Si cela vous intéresse, suivez le cours INF3135 – Construction et maintenance de logiciels ou lisez sur cmake et autoconf. Pour le cours INF3105, l'écriture de fichier Makefile à la main sera suffisante.
2. Éditez lab1.cpp :[...] private: double x; double y; [...]
1. Éditez point.cpp pour implémenter distance(). Vous pouvez trouver quelle est la fonction racine carrée en consultant la documentation à http://cppreference.com/.
2. Éditez lab1.cpp pour passer au main5().
3. Testez.
1. Éditez lab1.cpp pour passer au main6().
2. C'est à votre tour d'écrire le code... Ajoutez ce qu'il faut pour lire tous les points...
3. Tapez la commande :
./lab1 < nuage1.txt
Vous devez coder 2 boucles for
Votre programme doit afficher la distance entre les 2 points les plus près.
Tapez les commandes :
make ./lab1 < nuage1.txt
1. Tapez les commandes :
time ./lab1 < nuage1.txt time ./lab1 < nuage2.txt time ./lab1 < nuage3.txt time ./lab1 < nuage4.txt time ./lab1 < nuage5.txt
2. Modifiez Makefile afin d'utiliser l'option -O3 du compilateur.
3. Tapez les commandes :
make clean make time ./lab1 < nuage1.txt time ./lab1 < nuage2.txt time ./lab1 < nuage3.txt time ./lab1 < nuage4.txt time ./lab1 < nuage5.txt
Observations?