CRO TD1 First C program, compilation tools (gcc, make) (1 séance sur machine) E
CRO TD1 First C program, compilation tools (gcc, make) (1 séance sur machine) En complément de ce sujet se trouvent sur Moodle, les transparents présentant les notions vues dans ce TD. Pensez à les télécharger et les parcourir avant de commencer. 1 Premier programme C Nous allons commencer par mettre en place l’environnement qui vous permettra de programmer en C. Cet environnement consiste simplement à avoir : — Un éditeur pour la programmation (emacs ou vi pour les plus vieux), éviter gedit. — Connaître la commande de compilation : gcc — Connaître les bases de l’outil make On rappelle ci-dessous le processus de compilation d’un programme C, par exemple le programme ex.c illustré à gauche : #include <stdio.h> int main() { printf("hello World\n"); return(0); } ex.o gcc −c ex.c ex gcc ex.c −o ex stdio.h ex.c libstdio.a gcc ex.o −o ex QUESTION 1 ▶Tapez le programme C ci-dessus dans un fichier texte que vous nommerez hello.c (si vous ne comprenez pas ce qu’est censé faire ce programme, appelez l’enseignant). QUESTION 2 ▶Compilez ce programme avec la commande : gcc hello.c -o hello Débuggez s’il y a un message d’erreur. Vérifiez bien que vous avez un fichier exécutable hello qui a été créé en tapant : file hello Quel est le format du binaire? QUESTION 3 ▶Exécutez ce programme en tapant : ./hello 2 Mon premier Makefile Nous allons apprendre à utiliser systématiquement un outils d’aide à la compilation, l’outil make QUESTION 4 ▶Créez un fichier intitulé Makefile dans lequel vous taperez les lignes suivante : all: hello hello: hello.c gcc hello.c -o hello clean: rm -f hello 1 Attention, les ligne 4 et 7 doivent commencer par un caractère de tabulation (et non pas 8 espace), c’est indispensable pour la syntaxe de make Ce fichier Makefile, traduit en français veut dire : — Lorsqu’on m’appelle (i.e. commande make), je dois réaliser la cible hello (ça c’est la première ligne). — Pour réaliser la cible hello, je dois avoir la cible hello.c (ligne 3, on dit : “hello dépend de hello.c). — De plus (ligne 4), si cette cible hello.c est plus récente que le hello que j’ai, je dois exécuter la commande indiqué à la ligne suivante (après le caractère de tabulation) : gcc hello.c -o hello. — Enfin, pour réaliser la cible clean, je doit faire la commande rm -f hello. QUESTION 5 ▶Exécuter la commande : make Comprenez vous ce qu’il se passe? Exécutez la commande : make clean, puis make à nouveau. Principe de la commande make Le fichier Makefile est le fichier de configuration par défaut de la commande make (on peut changer le nom du fichier de configuration avec l’option -f de make). La commande make est équivalente à make all, c’est à dire qu’elle essaye de réaliser la cible all. Pour réaliser une cible il faut réaliser ses dépendances (ici hello). Les cibles peuvent être des fichiers (comme hello par exemple), ou pas (comme clean par exemple). La cible hello dépend de la cible hello.c. L’outil make vérifie que la date de création de hello.c est postérieure à la date de création de hello (et oui, sinon il n’y a pas besoin de recompiler, on l’a déjà fait), c’est le grand intérêt d’un tel outil (en dehors du fait de ne pas être obligé de taper la commande gcc à chaque fois) : il n’exécute que les commandes de compilation nécessaires après un changement dans les fichiers sources, ce qui fait gagner beaucoup de temps par rapport à une recompilation de tous les fichiers. QUESTION 6 ▶Refaites la commande make, il ne devrait rien se passer. Modifiez le fichier hello.c (rajoutez des espaces, ou mieux : un commentaire du style /* mon premier commentaire C */) et retentez un make. 3 Compilation et édition de lien Comme vous l’avez vu sur le schéma de compilation vu en cours (et redonné au début de ce TD), on a deux chemins pour passer de hello.c à hello : — le chemin direct comme on a fait en section ??. — le chemin en deux étapes, d’abord on produit un fichier objet (hello.o), puis un fichier exé- cutable (hello) QUESTION 7 ▶Tapez les commandes correspondantes de compilation (l’option -c de gcc permet de spécifier que l’on produit un fichier objet) : gcc -c hello.c -o hello.o gcc hello.o -o hello Comprenez bien ce qu’il se passe, demandez à l’enseignant si vous avez un doute QUESTION 8 ▶Modifiez votre Makefile pour que la compilation se fasse en deux étapes (attention, il faut que vous rajoutiez une cible pour cela). La compilation en deux étapes est primordiale pour réduire le temps de compilation des gros lo- giciels. On ne fait que la compilation (la première étape s’appelle aussi la compilation, c’est un peu 2 déroutant) du fichier que l’on a modifié et on fait l’édition de lien (c’est le nom de la deuxième passe) avec tous les fichiers objets. QUESTION 9 ▶Sachant que l’édition de lien prend beaucoup moins de temps que la compilation, quel est, selon vous, l’intérêt de faire de la compilation séparée (on dit compilation séparée lorsque l’on sépare la compilation des différents fichiers sources et l’édition de lien). Validez avec un enseignant. 4 Variables et Types en C Les variables en C La notion de variable est très importante en programmation. Du point de vue sémantique, une variable est une entité qui contient plusieurs information : — Une variable possède un nom, on parle d’identifiant — Une variable possède une valeur qui change au cours de l’exécution du programme — Une variable possède un type qui caractérise la nature des valeurs qu’elle peut prendre. Du point de vue pratique, une variable est un moyen mnémotechnique pour désigner une partie de la mémoire. En C les noms des variables sont composés de la manière suivante : une suite de caractères parmi : — les lettres (minuscules ou majuscules, mais non accentuées), — les chiffres (sauf en début de nom), — le “blanc souligné” (_). Un programme C se présente de la façon suivante : directives au préprocesseur déclarations de variables globales fonctions secondaires int main() { déclarations de variables internes instructions } #include <stdio.h> int main() { int year; year=2018; printf("hello %d World\n",year); return(0); } QUESTION 10 ▶Que fait le programme C ci-dessus? Modifiez votre programme précédent pour qu’il devienne celui-ci et compilez le avec make. 3 Les types de base en C En C, les variables doivent être déclarées avant d’être utilisées, on dit que C est un langage typé. Les types de base en C sont désignés par des spécificateurs de type qui sont des mots clefs du langages, il y en a essentiellement 3 : — les caractères (char), — les entiers (int, short, unsigned long) — les flottants (nombres réels, float, double). Il n’y a pas de type booleen, ils sont codés par des int (False étant 0, toutes les autres valeurs étant True) Une instruction composée d’un spécificateur de type et d’une liste d’identificateurs éventuel- lement initialisés séparés par une virgule est une déclaration. Par exemple : int a; //declaration d’une variable a entiere, sans initialisation int b = 1, c; //declaration des variables b et c. b est initialise a 1 double x = 2.38e4; //declaration et initialisation de x de type double char message[80]; // declaration d’une variable message // de type ’tableau de 80 caracteres’ (cf next TD) 5 Compilation avec plusieurs fichiers La notion de bibliothèques (library en anglais, si bien que l’on fait souvent l’angliscisme de les appeler librairies) est très importante : on réutilise des fonctions programmées par d’autres personnes. En C, contrairement à d’autres langages comme Python, il y a assez peu de bibliothèque standard que l’on trouvera sur tous les systèmes. On les rencontrera au fur est à mesure. Les plus importantes pour l’instant sont la librairie C (libc) qui permet de faire les opérations élémentaires sur le système et la librairie d’entrées/sortie (libstdio) qui permet de faire des entrées/sortie dans les programmes. Assez rapidement, nous allons nous habituer à programmer nous-mêmes nos programmes en utili- sant plusieurs fichiers source. Pour cela on aura besoin d’un nouveau type de fichier : les fichiers .h qui contiennent les en-têtes de fonction ainsi que les définitions de type. QUESTION 11 ▶Modifiez le nom de la fonction main dans le fichier hello.c, appelez là hello et créez les nouveaux fichiers hello.h, Makefile et main.c qui sont les suivants : Fichier hello.h int hello(); Fichier Makefile all: main main: main.o hello.o gcc main.o hello.o -o main hello.o: hello.c hello.h gcc -c hello.c -o hello.o main.o: main.c hello.h gcc -c main.c -o main.o clean: rm -f hello *.o Fichier main.c #include <stdio.h> #include "hello.h" int main() { int erreur; erreur=hello(); if (erreur!=0) printf("Error in hello\n"); return(0); } QUESTION 12 ▶Vérifiez d’abord que la compilation se passe bien, puis étudiez bien chaque fichier, vous devez être capable de répondre aux questions suivantes : 4 — À quoi sert l’include de hello.h dans main.c? — Pourquoi certains includes sont uploads/Industriel/ cro-td1-first-c-program-compilation-tools-gcc-make-1-seance-sur-machine.pdf
Documents similaires










-
28
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jul 12, 2021
- Catégorie Industry / Industr...
- Langue French
- Taille du fichier 0.1727MB