User Tools

Site Tools


projtec:gcc

Compilation

Ici, nous nous intéressons uniquement à la compilation de programme C99 sous Linux avec le compilateur GNU.

Considérons un programme hello.c en un seul fichier.

hello.c
#include <stdio.h>
int main(int argc, char* argv[]) {
  printf("hello world!\n");
  return 0;
}

Pour rendre ce programme exécutable, il faut le compiler avec gcc:

gcc -std=c99 hello.c -o hello   # compilation
./hello                         # exécution

En fait, la ligne de compilation précédente est un raccourci. En principe, on distingue deux étapes, la compilation des fichiers sources (.c) en fichier objet (.o) et l'édition de lien qui combine les fichiers objets pour générer un exécutable. Ce qui donne :

gcc -std=c99 -c hello.c             # compilation (génère hello.o)
gcc hello.o -o hello                # édition de lien (génère l'exécutable hello)

Supposons maintenant que notre programme se compose de plusieurs fichiers : le programme principal toto.c avec la fonction main() ainsi que plusieurs fichiers annexes tutu.c et tata.c. De plus, ce programme utilise la fonction sqrt() de la bibliothèque mathématique standard (libm.a). Pour compiler ce programme en ligne de commande, il faut d'abord générer tous les fichiers objets !

gcc -std=c99 -c toto.c tutu.c tata.c

Puis, on réalise l'édition de lien sans oublier l'option “-lm” qui indique d'utiliser la bibliothèque statique libm.a, généralement disponible dans un répertoire standard du système (typiquement /usr/lib).

gcc toto.o tutu.o tata.o -o toto -lm

Imaginons maintenant qu nous souhaitons regrouper les fichiers tutu.c et tata.c au sein d'une bibliothèque statique libpouet.a. La construction de bibliothèque permet de favoriser la “réutilisabilité” des fonctions d'une sous-partie du programme. Pour construire cette bibliothèque, il faut regrouper plusieurs fichiers objets au sein d'un archive :

ar rcs libpouet.a tutu.o tata.o 

On peut ensuite utiliser cette bibliothèque pour la compilation avec l'option '-lpouet' :

gcc toto.o -o toto -L. -lpouet -lm

L'option '-L.' indique que le fichier libpouet.a est disponible dans le répertoire courant ('.').

Todo : Expliquer l'option -I.

projtec/gcc.txt · Last modified: 2024/03/18 15:06 by 127.0.0.1