======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. #include 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.//