Compilation Séparée


Et notre schéma de compilation ?


On peut ajouter les inclusions des fichiers *.H dans les *.C du préprocesseur maintenant non ? Ce qui nous donne maintenant une compilation plus détaillée (le préprocesseur intervient) :





Qu'est ce que le compilateur vient faire dans ton schéma alors que c'est lui qui fait tout le processus ?

Il y a donc deux compilateurs ?


Bonne question ! Non, il y en a bien un seul.


En réalité, par abus de langage, le terme compilation est souvent utilisé pour désigner la totalité du processus de génération du programme exécutable.


Je ne vais pas m'étendre sur ce point, je continuerai à utiliser abusivement les termes compilation et compilateur.


Entre nous, c'est plutôt un service que je vous rends .


Notez que j'ai mis 2 headers car notre petit programme par défaut en inclue 2 mais vous savez bien qu'il peut en avoir beaucoup plus que 2, il y a même des headers qui incluent des headers qu incl... (vous me comprenez ).


Plus tard, nous apprendrons à créer nos propres headers pour aérer notre code.


Oué mais attend, tu dis que c'est le préprocesseur qui inclue les headers *.H dans les fichiers *.C et que c'est le compilateur qui traduit les fichiers *.C en *.O mais c'est qui qui transforme les fichiers *.O en un exécutable *.EXE ? Tu as mis des points d'interrogation !


Vous recherchez la difficulté ! Mais c'est une bonne question (je n'ai pas mis les points d'interrogation pour rien).


Je vais vous dévoiler le vrai schéma de la compilation du code source minimal que nous propose Code::Blocks (enfin presque mais ça nous suffira largement, accrochez-vous ça va bouger un peu).




Ici, stdio.h et stdlib.h sont des headers certes, mais ce sont encore plus que des headers, ce sont des headers de la bibliothèque standard de C, standard car elle est fournie avec n'importe quel compilateur pour C.


Retenez la signification du mot standard pour le moment.


D'accord mais une bibliothèque, c'est quoi ? Et c'est quoi ton fichier *.A ? Et c'est quoi le linker ?


En fait vous avez la réponse dans votre question, le fichier *.A est la bibliothèque standard de C.


Je pourrais prendre toute ma journée à répondre précisément à votre question. Je vais essayer de faire simple.


Une bibliothèque c'est un ensemble de fonctions toutes prêtes comme par exemple, la fonction printf.


On trouve aussi le mot librairie pour désigner bibliothèque mais c'est anglais car la traduction de library est bibliothèque.


Le linker est l'éditeur de liens. Il ne fait aucune traduction et se contente de lier des fichiers pour former l'exécutable.


C'est la dernière étape d'une compilation.


Bah je comprends pas trop la différence entre une bibliothèque et un header...
Tu m'as juste dit qu'un header c'était pour faire fonctionner printf...


En fait, c'est la bibliothèque qui fait fonctionner printf et c'est le header qui fait fonctionner la bibliothèque.


Ici, les deux fichiers stdio.h et libc.a servent donc à faire fonctionner printf (en effet, stdlib.h ne nous sert à rien pour le moment).


Ce n'est pas très grave si vous ne comprenez pas tout du premier coup, un header c'est simplement le fichier *.H permettant généralement (oui il y a des exceptions) d'utiliser des fonctions.


Il n'y a pas de fonctions dans un header (mais c'est une norme, on peut alors trouver des exceptions).

Et une bibliothèque c'est un fichier comportant plusieurs fonctions (ayant souvent l'extension *.A, *.LIB ou *.DLL).


Chaque bibliothèque peut être utilisée à condition d'avoir pris connaissance de son mode d'emploi qui se trouve dans ses headers. Pour une bibliothèque, on peut trouver plusieurs headers.


En incluant par exemple le header stdio.h, on va pouvoir utiliser qu'une partie (qu'un nombre limité de fonctions) de la bibliothèque standard, cette partie nous permettra d'afficher du texte à l'écran.


Dans cette partie, on trouve donc la fonction printf.


Il existe des headers incluant tous les headers d'une bibliothèque !


La bibliothèque standard se nomme libc.a dans mon schéma mais son nom est extrêmement variable.


Sous les systèmes Unix, elle se nomme généralement libc.a mais sous Windows, elle fait souvent partie du système d'exploitation.


On va considérer que la bibliothèque standard est libc.a pour simplifier.


Oui, je dois vous l'avouer, c'est assez tordu, je suis obligé de simplifier un bon nombre de points ! Si vous retenez que la bibliothèque standard de C est libc.a, c'est suffisant.


Bon je traduis mon dernier schéma de la compilation c'est parti écoutez bien !

  • Premièrement, toutes les directives du préprocesseur sont exécutées par le préprocesseur.
    Sa tâche principale est d'inclure des headers (stdio.h et stdlib.h) dans des fichiers *.C (main.c) et de retirer tous les commentaires de chaque fichier du projet.
    Dans les headers, on trouve principalement le mode d'emploi de fonctions compilés d'une bibliothèque (libc.a).

  • Ensuite, le compilateur traduit chaque fichier *.C (main.c) un par un en fichier *.O (main.o), écrit en langage machine.
    C'est l'étape la plus facile à comprendre. On a un fichier *.O pour un fichier *.C.

  • Enfin, c'est le rôle du linker que je ne vous ai pas encore bien parlé, il lie, assemble tous les fichiers compilés (main.o et libc.a) pour former l'exécutable.
    En effet, les fichiers *.O et *.A sont de même langage (langage machine), ils peuvent donc être liés pour former l'exécutable !


Il existe aussi des fichiers compilés *.LIB (que j'abrégerai maintenant bibliothèque) qui sont similaires aux bibliothèques *.A.


Ne soyez donc pas étonner si vous en rencontrez un jour.


Pour ne pas alourdir l'exécutable, le linker va comparer main.o et libc.a pour savoir quelle partie (quelles fonctions) de libc.a il va devoir assembler.


En effet, on utilise ici que printf, cette fonction n'occupe même pas un pour cent de la bibliothèque standard !


Retenez juste ces deux phrases...

  • Une bibliothèque, c'est un ensemble de fonctions.
  • Un header, c'est le mode d'emploi de plusieurs fonctions (faisant parties d'une bibliothèque ou non) permettant de les utiliser.
    Imaginez ce qui peut se passer si vous ne mettez pas les headers, comment le compilateur va savoir si printf est une fonction puisque que la fonction elle-même est incluse pendant l'édition de liens ?


Mais on a inclue que des headers, comment on arrive à utiliser printf alors qu'on a pas lié la bibliothèque standard libc.a ?


Encore une très bonne question.


En réalité, lorsque vous créez un nouveau projet en C, ce dernier est configuré par défaut en fonction du template, la bibliothèque standard est donc liée automatiquement ! C'est comme ça, il faut l'accepter.


C'est en quelque sorte la particularité d'une bibliothèque standard.


Pour vous rassurer, on va utiliser pendant un bon bout de temps la bibliothèque standard de C, donc pas de soucis, il faudra juste inclure les headers qui nous intéressent.


Je vous montre une liste de nouveaux mots à connaître :

  • Compilation
  • Directive du préprocesseur
  • Fonction
  • Instruction
  • Bibliothèque
  • Header


Ne restez pas trop longtemps à comprendre le mot bibliothèque, l'essentiel qu'il faut comprendre c'est qu'il faut inclure nos headers stdlib.h et stdio.h pour pouvoir utiliser des fonctions de la bibliothèque standard de C et ainsi afficher du texte à l'écran .


Un autre exemple pour bien comprendre une compilation en C.





Ici, on utilise deux bibliothèques (avec l'extension *.A) et deux fichiers *.C !


On peut alors supposer qu'un header permet d'utiliser une partie d'une bibliothèque et l'autre header permet d'utiliser une partie de l'autre bibliothèque !


Pour vous rassurer, je ne vous demande pas de connaître tout ça par coeur, ce n'est pas très important pour la suite, on aura l'occasion d'en reparler plus tard, lorsque l'on créera nos propres en-têtes (headers) ou qu'on installera des bibliothèques pour programmer en fenêtre. Mais sincèrement, pour les nombreux chapitres à venir, on utilisera uniquement la bibliothèque standard et un seul fichier *.C.


Alors rien de bien compliqué...


C'est bon, vous avez tout compris ? Parfait on passe à la suite !


Nous allons modifier le code source minimal.

Créé avec HelpNDoc Personal Edition: Créer des livres électroniques facilement