Première compilation avec GCC sous Linux



(Vos commentaires sont les bienvenus : mailto:jciehl@bat710.univ-lyon1.fr)   


Compilation ?

    Lorsque vous tapez un fichier source C, il ne s'agit que de texte, ce ne sont pas des instructions que le processeur peut éxécuter. Plutot que de traduire à la main le source C en instructions pour le processeur, il est plus pratique d'utiliser un outil : le compilateur C.

    La compilation est constituée de plusieurs étapes, qui sont regroupées sous le terme 'compilation' par abus de langage.

    En résumé, la première étape, dont le nom correct est effectivement compilation, analyse le source C, vérifie qu'il est correct (qu'il ne comporte ni ambiguités, ni erreurs) et génère l'ensemble d'instructions processeur correspondant. Le résultat de cette première étape est un nouveau fichier appelé fichier objet qui contient les instructions générées.

    Cette étape ne suffit pas à construire le programme éxécutable complet puisqu'il manque encore plusieurs choses. En effet, vous utilisez des fonctions que vous n'avez pas écrites : lire un caractère, écrire un caractère, les fonctions mathématiques, etc. Ces fonctions et les instructions processeurs qui les réalisent sont fournies avec le compilateur C. Les fonctions standards sont regroupées dans un fichier par thème : une librairie. Il y a donc une librairie pour les fonctions mathématiques, les entrées / sorties, la gestion de la mémoire, etc. Cette organisation est très pratique, mais votre programme n'utilise, en général, que quelques fonctions de chaque librairie. C'est le rôle de la deuxième étape, appelée édition de liens de déterminer quelles fonctions sont nécessaires à votre programme, d'extraire de leurs librairies respectives les blocs d'instructions processeurs correspondants et de relier ensemble tous les blocs d'instructions pour former votre programme éxécutable complet.

    Le paragraphe suivant présente l'utilisation de gcc pour réaliser ces deux étapes.

GCC ?

    Le compilateur C (cf. première étape, ci-dessus) et l'éditeur de liens (cf. deuxième étape ci-dessus) sont accessibles à travers la même commande : gcc.  La documentation ainsi que le code source complet des outils sont disponible chez la Free Software Foundation dans le projet GNU. Pour les curieux, le manuel est également disponible.

    Il faut donc indiquer à la commande générale gcc si l'on souhaite compiler un fichier source ou construire le programme éxécutable. Les paragraphes suivants détaillent les paramètres de gcc dans les deux cas.

    Compiler avec GCC

    Pour indiquer à gcc que l'on souhaite compiler un fichier source, il suffit de lui donner l'option -c et le nom de votre fichier source. On peut également choisir le nom du fichier objet résultat de la compilation avec l'option -o. Tapez la ligne suivante dans un terminal / interpréteur de commande en remplacant les noms de fichiers par les votres :

    gcc -Wall -o nom_du_fichier_objet  -c nom_du_fichier_source_C

    L'option -Wall demande au compilateur d'afficher tous les messages de prévention (lorsque quelquechose est ambigue, par exemple). Si tout ce passe bien, gcc a crée le fichier objet (en général, c'est le nom du fichier source C avec l'extension .o). Vous pouvez le vérifier avec la commande ls (qui affiche la liste des fichiers du répertoire courant). Il est temps de passer à la deuxième étape.

attention :
avant de taper cette commande, il faut placer l'interpreteur de commandes dans le répertoire qui contient vos fichiers sources avec la commande cd. Par exemple, si vos sources se trouvent dans le répertoire TP1, il suffit de taper "cd TP1". Vous pouvez vérifier que tout est correct en demandant la liste des fichiers présents dans le répertoire courant avec la commande "ls". Si la liste de vos fichiers sources apparaît, c'est bon, vous pouvez compiler, sinon recommencez.
   

    Edition de liens avec GCC (produire l'éxécutable)

    Pour construire le programme éxécutable, il faut indiquer à gcc quels morceaux doivent être utilisés. Au minimum, le fichier objet généré par la compilation et éventuellement une librairie (ou plusieurs, selon le cas). L'option -o permet d'indiquer le nom du programme éxécutable à construire et l'option -l le nom d'une librairie. De manière générale la commande ressemblera à :

    gcc -o nom_du_programme   -lnom_de_la_librairie   nom_du_fichier_objet  

    Prenons un exemple complet : vous voulez compiler tp.c qui se trouve dans le répertoire TP1 de votre compte.
  1. ouvrez un terminal / interpréteur de commandes
  2. placez l'interpréteur de commandes dans le répertoire qui contient tp.c, c'est à dire TP1 : "cd TP1"
  3. compilez tp.c et créez tp.o, le fichier objet : "gcc  -Wall  -o tp.o   -c tp.c"
  4. construisez le programme éxécutable tp avec le fichier objet tp.o : "gcc -o tp  tp.o"
  5. éxécutez votre programme : "tp" ou "./tp"
    Si votre programme utilise une fonction de la librairie mathématique, par exemple, il faut le dire à l'éditeur de liens avec l'option -l. La librairie mathématique s'appelle tout simplement m. Il faut donc ajouter l'option  -lm à l'étape 4 ci-dessus :

     4bis.  construisez le programme éxécutable tp avec le fichier objet tp.o et la librairie mathématique : "gcc -o tp  -lm  tp.o"

Compiler un projet composé de plusieurs fichiers sources

    Il est tout à fait possible de taper toutes les commandes nécessaires à chaque fois, mais c'est rapidement fastidieux et source d'erreurs, il est beaucoup plus simple d'utiliser un outil de gestion de projets : make

Suite de la lecture : gestion de projets : Make et Makefile