Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/02/2006, à 14:17

trucutu

[Résolu] problème avec math.h

Bonjour

Je voudrais compiler ce petit programme :

#include <stdio.h>
#include <math.h>
#include <tgmath.h>

main()
{
   double p=0.0 ;
   printf ("Hello world \n");
   p = log(3.0) ;
   printf ("%g \n", p) ;
}

En fait, c'est un petit test pour compiler des programmes bien plus gros. Mais le problème c'est que j'obtiens ca :

cc -o Hello_world Hello_world.c

/tmp/cc6AkoRY.o: dans la fonction « main »:
Hello_world.c:(.text+0x4c): référence indéfinie vers « log »
collect2: ld a retourné 1 code d'état d'exécution

La fonction log n'a pas l'air définie dans le fichier math.h (?!). Elle semble l'être dans tgmath.h, mais l'inclusion de ce fichier ne résout pas le problème...

Quelqu'un aurait il le même problème? (ou pas...)
J'ai installé build-essential pour faire la compilation. Est-ce suffisant?
Est-ce une erreur de synthaxe ?....

merci d'avance

Dernière modification par trucutu (Le 08/02/2006, à 15:05)


La chanson du dimanche - "La pêche !"
PC acheté chez Novatux : entièrement satisfait.
Faire des recherches solidaires !

Hors ligne

#2 Le 08/02/2006, à 14:27

avr

Re : [Résolu] problème avec math.h

Essaye de compiler avec:
cc -o Hello_world Hello_world.c -lm

Dernière modification par avr (Le 08/02/2006, à 14:28)

Hors ligne

#3 Le 08/02/2006, à 14:45

trucutu

Re : [Résolu] problème avec math.h

ca marche ! merci

ca sert à quoi ce "-lm" (ca à l'air bien caché dans man cc qui est bien long...) ?


La chanson du dimanche - "La pêche !"
PC acheté chez Novatux : entièrement satisfait.
Faire des recherches solidaires !

Hors ligne

#4 Le 08/02/2006, à 15:53

avr

Re : [Résolu] problème avec math.h

Quand tu met #include <math.h>, ce ne sont que des déclarations de fonctions et de variables. Il n'y a pas d'implémentation (normal, c'est un header). L'implémentation est déjà compilée, sous forme d'une librairie, à savoir libm.a et libm.so(1) (dans /usr/lib normalement). Il faut donc que tu indiques à ton compilateur de "rajouter" cette librairie, tu le fait par l'option -lm (si tu as une librairie qui s'appelle libtoto.a, l'option est -ltoto).

Tu peux te dire:" quel intérêt? Comme je veux des fonctions mathématiques, il me faut les déclarations et implémentations! C'est de la redite!"
Pas tout à fait:
Imagine que dans ton prog, tu n'aies besoin que de la "constante" pi (3.14.159...). Elle est déclarée dans math.h comme un define (#define M_PI 3.1415... je crois). Et c'est tout. Il n'y a pas d'implémentation à proprement parler pour elle. C'est pourquoi dans ton programme, tu pourras avoir le #include <math.h> , utiliser M_PI, ta compilation pourra ne pas faire appel à libm.* (pas de -lm) et tout se passera correctement.
De même, tu peux estimer que les déclarations dans le math.h ne sont pas optimisées pour ton prog, ou tu n'as besoin que d'une seule fonction. Alors, tu n'inclues pas <math.h>, mais tu définies par exemple:

//déclaration de la fonction log()
double log(double);

et pour compiler tu ajoute le -lm (dans ton prog, tu n'auras pas d'implémentation de la fonction log(), juste la déclaration). Et ça, ça marche aussi.

Donc (je sais pas si c'est clair), le "linkage" et la déclaration d'en-têtes sont 2 choses différentes. Complémentaires, certes, mais non exclusives.
Évidemment, l'intérêt de l'optimisation (dans ce cas, c'est plutôt de la modularité) pour un Hello World n'est pas flagrante, mais imagine pour des codes très compliqués.

Bon, si tu commences, te prends pas la tête:
- mets l'include ET fait les link nécessaires;
- ne cherches pas par contre à inclure le math.h puis à implémenter toi-même des fonctions complexes (log, sinus, etc): les mecs qui ont écrit les librairies standarts feront toujours mieux que toi (et que moi!) wink
@+


(1).a ou .so selon que c'est lié respectivement de façon statique ou dynamique. Je te laisse avec notre pote à tous (Google) si tu ne sais pas ce que c'est.

[edit]orthographe

Dernière modification par avr (Le 08/02/2006, à 15:58)

Hors ligne

#5 Le 08/02/2006, à 16:34

trucutu

Re : [Résolu] problème avec math.h

....
en gros, -lm sert à aller chercher dans les librairies, le code des fonctions déclarées dans math.h

je vois mieux, je vais le mettre désormais

anecdote : en fait, je devais compiler un code crée à partir de Linux (avec un makefile et tout...) qui contient 5 .c et 1 .h (on est loin du hello world... wink ). Comme j'avais ce message d'erreur, je l'ai d'abord compilé sous windows. Mais comme j'aimerais bosser de + en + sous Linux (qui de plus est programmé majoritairement en C...), il me fallait résoudre ce problème... en refaisant au passage le makefile et en incluant l'option magique, tout marche !

merci pour les explication
PS : t'inquiètes pas, je ne vais pas m'amuser à redéfinir les "fonctions complexes"


La chanson du dimanche - "La pêche !"
PC acheté chez Novatux : entièrement satisfait.
Faire des recherches solidaires !

Hors ligne

#6 Le 08/02/2006, à 16:48

avr

Re : [Résolu] problème avec math.h

trucutu a écrit :

(...)
PS : t'inquiètes pas, je ne vais pas m'amuser à redéfinir les "fonctions complexes"

Ouh là! Je m'inquiète pas! Tu fais comme tu veux, hein... wink
Bonne route.

Hors ligne