>> Mais alors: A quoi ça sert de mettre "#include<math.h>" en début de programme???
La compilation d'un programme écrit en C est un peu moins simple que l'appel à gcc pourrait le laisser penser.
Pour simplifier:
1) Ton programme source (xyz.c) est d'abord lu par un "pré-processeur", celui-ci va exécuter les instructions préprocesseur contenues dans ton programme, toutes celles commençant par # (en principe, par souci de portabilité le # devrait être le premier caractère de la ligne). C'est à cette étape que les fichiers "header" (dans ton cas, math.h, par exemple) sont lus et vont s'insérer à l'emplacement du #include correspondant. Ils s'agit de fichiers sources, essentiellement des déclarations de types, des déclarations de fonctions (prototypes), etc. En aucun cas des instructions exécutables (même si certains malpropres le font ...). À l'aide de #include <math.h> tu vas introduire dans ton sources les prototypes de sin(), cos(), etc, mais absolument pas les instructions correspondantes. Le préprocesseur constitue un fichier xyz.i.
2) Le fichier xyz.i est pris en charge par le compilateur proprement dit. Celui-ci, pour faire simple, va optimiser et traduire le langage C en un programme équivalent en assembler. Le fichier contenant le langage assembler s'appelle xyz.s.
3) Le fichier yxz.s est pris par l'assembler qui le traduit en langage machine relogeable (translatable). Les adresses données dans les instructions sont définies comme si le programme devait être chargé à l'adresse 0 et, surtout, il contient encore des informations qui permettent de déplacer le programme en mémoire. Le fichier porte le nom xyz.o.
4) Le fichier yxz.o constitue l'une des entrées de "l'éditeur de liens", ce programme va alors rechercher dans les librairies statiques (dans ton cas /usr/lib/libm.a) les modules déjà compilés (sin(), cos(), etc) et les incorpore dans ton programme pour en faire un programme exécutable (a.out si tu ne change pas le nom). Avec l'option -lm, tu indiques au link-edit de gcc que tu veux utiliser la librairie statique libm.a.
Voilà, pour l'essentiel et pour faire court. Cela dit, il y a de forte chance qu'en réalité ton programme utilise une librairie partagée (libm.so) (dans le monde window$ on parle de DLL). L'édition de lien est faite alors par le "loader", le programmme qui charge ton programme en mémoire en vue de l'exécution, Pour Linux, un module dynamique n'est chargé qu'au moment de la première utilisation par le programme (pour autant qu'il n'existe pas déjà une copie du module en mémoire. Oublie un peu le dernier paragraphe, et comprends bien les points 1) à 4), tu auras dàjà fait un grand progrès.
Salut, elle est pas belle la vie ?
Poste le Sunday 11 January 2004 20:17:25