Compilation séparée (3) – Fichiers objets et compilation manuelle.

compilation_separee-3
Bon apparemment c’est un thème qui intéresse pas mal de visiteurs, et c’est tant mieux. Je rappelle pour ceux qui tomberaient précisément sur cette page que cet article s’inscrit dans une suite de quatre articles traitant de la compilation séparé, entre les articles Généralités sur la compilation séparée en C et Compilation séparée (2) – Dépendances qui le précèdent, et l’article Compilation séparée (4) – Le Makefile, qui le suit. Aujourd’hui nous allons nous intéresser aux fichiers objet, et étudier la compilation manuelle du projet en ligne de commande.

6) Les fichiers objet.

Je suis loin de maîtriser parfaitement ce concept, donc j’ai effectué quelques recherches sur Google. Il s’est très vite avéré que la documentation en français disponible à ce sujet était plus que limitée, donc comme d’habitude je suis allé voir sur des sites en anglais. Je vais essayer de parler simplement.

On se souvient que le compilateur a pour rôle de traduire un fichier source .c écrit dans un langage intelligible par l’être humain en un fichier contenant du code machine compréhensible par un ordinateur. Or il se trouve que la compilation passe par plusieurs étapes intermédiaires, et que pour chacune de ces étapes, on peut demander au compilateur de générer le fichier correspondant à cette étape.

Par exemple il va y avoir une étape où les #include et les #define vont prendre effet et où les commentaires vont être supprimés. Il va aussi y avoir une étape où le code C est transformé en langage machine, et il y a aussi une dernière étape appelée « édition des liens » durant laquelle toutes les dépendances entre fichiers différents sont résolues par inclusion du code correspondant dans un seul fichier (ce n’est pas tout à fait exact, mais ça suffit pour comprendre).

Et en gros le fichier objet correspond au moment au moment situé entre la traduction du C en langage machine et l’étape d’édition des liens. C’est une étape intéressante, car c’est la dernière où les fichiers peuvent rester séparés, vu qu’après tous deviennent nécessaires pour générer l’exécutable final.

7) Compilation des fichiers objet.

Par conséquent en compilation séparée, et dans les buts d’optimisation expliqués plus haut, on va compiler tous les fichiers en fichiers objets et s’arrêter là. Ensuite, on génèrera l’exécutable final à partir d’un programme de test, par exemple test.conduite.c (non représenté sur le dessin). Occupons nous tout d’abord de humain.o:

On va générer ce fichier à l’aide de la commande suivante: gcc -c humain.c

Cette commande est destinée à être exécutée dans un terminal. Bien sûr, il faut naviguer dans celui-ci jusqu’à votre répertoire de travail. Pour ceux qui utilisent un logiciel pour développer, ils ne le voient généralement pas, mais c’est ce que fait le système lorsqu’ils cliquent sur le bouton compiler. Dans cet exemple, je me place dans le cas le plus simple et pratique, pratique, celui du développement à l’aide d’un terminal et de fichiers textes sous Linux.

Notons que la commande donnée si dessus est celle utilisée lorsque l’on est sûr de son coup. En général lorsque l’on compile la première fois, on utilisera plutôt une commande du type suivant, dont je vais détailler la signification: gcc -g -Wall -c humain.c

  • gcc est le nom du compilateur C.
  • humain.c est le nom du fichier source
  • le reste, ce sont des options du compilateur, on le redonnait au tiret par lequel elles commencent.
  • -g demande au compilateur d’ajouter dans le code des balises qui vont permettre d’utiliser un debugger pour le cas échéant pouvoir analyser ce qui ne va pas dans le programme et où ça plante. Très pratique pour détecter la source des erreurs de segmentation autrement qu’en mettant des puts(« coucou ») partout dans le code.
  • -Wall demande au compilateur de signaler tout ce qui n’empêche pas la compilation, mais qu’il trouve bizarre. Et en général on essaiera d’éliminer ces avertissements, car lorsque le programme ne fait pas ce qu’on attend de lui, les problèmes viennent souvent de là.
  • enfin l’option -c demande au compilateur d’arrêter la compilation au fichier objet.

Notons qu’il n’est pas fait mention du fichier .h. Pourtant celui-ci est utilisé lors de la compilation par le biais du #include « humain.h » que vous n’aurez pas manqué de mettre dans le fichier humain.c

8.) Fin de la compilation:

Alors pour générer un exécutable qui marche à partir du projet décrit par l’image, il faut encore

  1. obtenir le fichier voiture.o via la commande gcc -g -Wall -c voiture.c,
  2. obtenir le fichier conduire.o via la commande gcc -g -Wall -c conduire.c,
  3. générer l’exécutable final via la commande suivante:

gcc -g -Wall -o Programme test.conduite.c humain.o voiture.o conduire.o

« Programme » est le nom de l’exécutable que vous allez générer. Vous remarquerez que l’option -o est utilisée. Elle indique au compilateur qu’il y a des fichiers .o à utiliser dans la compilation de l’exécutable final à partir du fichier test.conduite.c (qui sera le seul à inclure une méthode main). Concernant les options -g et -Wall, elles sont bien évidemment optionnelles :).

Voila pour aujourd’hui, j’espère avoir été assez clair (n’hésitez pas à poser des questions). Demain, si j’ai le temps, je concluerai sur la compilation séparée avec un article traitant de la rédaction d’un makefile.

Publicités

2 réflexions au sujet de « Compilation séparée (3) – Fichiers objets et compilation manuelle. »

  1. Ping : Compilation séparée (4) - Le Makefile « Aldian’s Blog

  2. Ping : Compilation séparée (2) - Dépendances. « Aldian’s Blog

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s