#1 Le 10/11/2012, à 19:45
- Simba_16
Problème de compilation avec "math.h"
(Problème résolu )
Bonjour,
J'utilise la bibliothèque "math.h" dans un programme en C, pour calculer cos et sin d'une variable
void mafonction(double var){
double a;
a = cos(var);
}
. mais mon programme ne compile pas, par contre il compile si je mets une valeur dans le cos
double a = cos(30);
.
Est ce quelqu'un peut m'aider svp ?
Dernière modification par Simba_16 (Le 11/11/2012, à 02:10)
Hors ligne
#2 Le 10/11/2012, à 20:24
- Zakhar
Re : Problème de compilation avec "math.h"
Bizarre chez moi ça compile sans problème:
$ cat m.c
#include <math.h>
void mafonction(double var){
double a;
a = cos(var);
}
$ gcc -c -o /dev/null m.c
$
Cependant, tu as certainement autre chose qui bloque car ici tu affectes une valeur à la variable a et tu ne t'en sers pas comme le dit gcc:
$ gcc -Wall -c -o /dev/null m.c
m.c: In function ‘mafonction’:
m.c:4:8: attention : variable ‘a’ set but not used [-Wunused-but-set-variable]
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#3 Le 10/11/2012, à 20:29
- pingouinux
Re : Problème de compilation avec "math.h"
Bonsoir,
Je ne comprends pas pourquoi, mais j'ai le même problème que Simba_16 :
$ cat x.c
#include <math.h>
#include <stdio.h>
double mafonction(double var){
double a;
a = cos(var);
return a;
}
main() {
double a=30;
printf("%lf\n",mafonction(a));
}
$ gcc x.c
/tmp/ccRYhj8Q.o: In function `mafonction':
x.c:(.text+0x13): undefined reference to `cos'
collect2: ld returned 1 exit status
Hors ligne
#4 Le 10/11/2012, à 20:39
- Zakhar
Re : Problème de compilation avec "math.h"
Ce n'est pas le même problème, toi tu as un problème d'édition de liens, regarde bien le sortie de gcc.
Il a parlé d'un problème de "compilation", et la "compilation" (option -c de gcc) se passe bien chez toi aussi. C'est juste qu'à l'édition de lien, il te manque des librairies parce que tu n'as pas linké avec -lm pour que la librairie mathématique soit rajoutée.
Et donc, de façon tout à fait normale, puisque tu n'as pas dit au linker de mettre la librairie mathématique, il ne trouve pas 'cos'. Ton résultat est donc 'work as design'
Dernière modification par Zakhar (Le 10/11/2012, à 20:40)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#5 Le 10/11/2012, à 20:39
- lann
Re : Problème de compilation avec "math.h"
Le problème a déjà été relevé ici :
<Modéré>
Hors ligne
#6 Le 10/11/2012, à 20:39
- telliam
Re : Problème de compilation avec "math.h"
pingouinux tu ne compiles pas de la meme maniere que Zakhar, toi tu fais la compilation et edition de lien en meme temps.
il faut que tu rajoutes -lm pour linker la librairie math.
dans le cas d'une variable non utilisée, tu peux rajouter
(void)a;
apres ton affectation pour virer le warning mais c déconseillé, les warnings sont souvent la pour montrer un véritable problème ou une erreur de conception.
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#7 Le 10/11/2012, à 20:43
- Simba_16
Re : Problème de compilation avec "math.h"
En fait, j'ai le même problème que pingouinux, et même quand j'utilise -lm.
Hors ligne
#8 Le 10/11/2012, à 20:44
- telliam
Re : Problème de compilation avec "math.h"
peux tu envoyer le log de la compilation ?
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#9 Le 10/11/2012, à 20:46
- Zakhar
Re : Problème de compilation avec "math.h"
Et le programme en entier !
Parce que comme j'ai dit, l'affectation à la variable a suivi du retour de la fonction... ça sent le programme tronqué, et l'erreur est probablement ailleurs !
Et pour différencier :
- erreur de compilation
- erreur à l'édition de lien
Tu peux utiliser
gcc -c
qui compile seulement.
Ca permet de clarifier si le bug vient d'une erreur dans le programme (si erreur sur gcc -c), ou d'une librairie manquante (si pas d'erreur sur gcc -c).
Dernière modification par Zakhar (Le 10/11/2012, à 20:49)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#10 Le 10/11/2012, à 20:48
- pingouinux
Re : Problème de compilation avec "math.h"
Merci de vos réponses, j'ai compris. Mais quelqu'un peut-il m'expliquer pourquoi tout se passe bien dans ce cas ?
#include <math.h>
#include <stdio.h>
double mafonction(double var){
double a;
a = cos(30);
return a;
}
main() {
double a=30;
printf("%lf\n",mafonction(a));
}
Hors ligne
#11 Le 10/11/2012, à 20:54
- Zakhar
Re : Problème de compilation avec "math.h"
Moi ça se passe bien aussi avec ta première version :
/tmp$ cat m.c
#include <math.h>
#include <stdio.h>
double mafonction(double var){
double a;
a = cos(var);
return a;
}
main() {
double a=30;
printf("%lf\n",mafonction(a));
}
/tmp$ gcc -o m m.c -lm
/tmp$ ./m
0.154251
... après, le résultat c'est avec un angle en radians bien sûr
Et oui pingouinux, ça se passe bien dans ta première version, parce que gcc "optimise". Si tu regardes bien ton code, tu verras que tu n'as nullement besoin de la fonction cos en 'runtime' puisque dans tous les cas ta fonction retourne une constante. Le génial gcc calcule donc la constante retournée par ta fonction et remplace celle-ci par le résultat. Par conséquent, nul besoin de librairie mathématique !
Dernière modification par Zakhar (Le 10/11/2012, à 20:57)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#12 Le 10/11/2012, à 20:54
- telliam
Re : Problème de compilation avec "math.h"
oula pas tous en mm temps, pingouinux, pourquoi ne voudrais tu que ca marche pas?
au fait ton main est mal fait : il doit prendre des arguments argc et argv et retourner un entier
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#13 Le 10/11/2012, à 21:03
- Zakhar
Re : Problème de compilation avec "math.h"
Pour t'en convaincre pingouinux, voici à quoi ressemble ta fonction sous nemiver :
double mafonction(double var){
double a;
a = cos(30);
return a;
}
a = cos(30);
0x00000000004004fd <mafonction+9>: movabs $0x3fc3be82f2505a52,%rax
0x0000000000400507 <mafonction+19>: mov %rax,-0x8(%rbp)
return a;
0x000000000040050b <mafonction+23>: mov -0x8(%rbp),%rax
0x000000000040050f <mafonction+27>: mov %rax,-0x20(%rbp)
0x0000000000400513 <mafonction+31>: movsd -0x20(%rbp),%xmm0
}
0x0000000000400518 <mafonction+36>: pop %rbp
0x0000000000400519 <mafonction+37>: retq
Tu vois, il met directement une constante dans rax et fait le return, aucun appel à aucune fonction.
Et donc la fonction 'cos' n'est pas utilisée, du coup inutile de linker avec -lm. CQFD
Dernière modification par Zakhar (Le 10/11/2012, à 21:04)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#14 Le 10/11/2012, à 21:03
- pingouinux
Re : Problème de compilation avec "math.h"
pourquoi ne voudrais tu que ca marche pas?
Je n'ai fait que remplacer cos(var) par cos(30), et je n'ai plus besoin d'ajouter -lm lors de l'édition des liens.
au fait ton main est mal fait : il doit prendre des arguments argc et argv et retourner un entier
Tout-à-fait d'accord. J'ai un peu bâclé pour faire le test.
Dernière modification par pingouinux (Le 10/11/2012, à 21:07)
Hors ligne
#15 Le 10/11/2012, à 21:05
- Simba_16
Re : Problème de compilation avec "math.h"
voila ce que j'ai fait :
gcc -c Main.c image.c allocation.c gradiant.c tfd.c
gcc -o -lm Main.o image.o allocation.o gradiant.o tfd.o
et ça me donne ça :
tfd.o: In function `tfd':
tfd.c:(.text+0x192): undefined reference to `cos'
tfd.c:(.text+0x1c5): undefined reference to `sin'
collect2: ld a retourné 1 code d'état d'exécution
Hors ligne
#16 Le 10/11/2012, à 21:10
- Zakhar
Re : Problème de compilation avec "math.h"
Ok, donc la compilation passe. C'est rassurant, ça ne vient pas d'un bug dans ton programme.
Essaye avec -lm à la fin. Il y a eu un changement depuis 12.04 qui fait que l'ordre a une importance.
Je me suis planté avec un des mes programmes linké avec curl, et ça venait de l'ordre des librairies... je n'ai plus l'explication "technique" exacte, mais au besoin je peux chercher, ça sent pareil que ce que j'ai eu avec libcurl.
Et du coup, j'ai fait un rapport de bug sur la documentation qui précisait encore l'ancienne commande (avec les librairies au début), et ils ont modifié la doc de libcurl pour refléter la nouvelle façon de faire.
Dernière modification par Zakhar (Le 10/11/2012, à 21:12)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#17 Le 10/11/2012, à 21:18
- Zakhar
Re : Problème de compilation avec "math.h"
@telliam #12 a écrit :pourquoi ne voudrais tu que ca marche pas?
Je n'ai fait que remplacer cos(var) par cos(30), et je n'ai plus besoin d'ajouter -lm lors de l'édition des liens.
Explications aux posts #11 et #13
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#18 Le 10/11/2012, à 21:21
- pingouinux
Re : Problème de compilation avec "math.h"
@Zakhar #13 :
Merci pour cette explication. Je me demande quand même comment le compilateur peut "connaître" la valeur de cos(30), puisqu'il n'a pas accès à la librairie qui contient la fonction.
Hors ligne
#19 Le 10/11/2012, à 21:22
- Simba_16
Re : Problème de compilation avec "math.h"
Et enfin ça marche , ta raison Zakhar il fallait mettre le -lm à la fin.
Merci beaucoup
Hors ligne
#20 Le 10/11/2012, à 21:57
- Zakhar
Re : Problème de compilation avec "math.h"
@Zakhar #13 :
Merci pour cette explication. Je me demande quand même comment le compilateur peut "connaître" la valeur de cos(30), puisqu'il n'a pas accès à la librairie qui contient la fonction.
C'est ton programme qui n'a pas accès à la librairie math si tu ne le précises pas, le compilateur lui les connaît.
Du reste c'est dans la norme et clairement précisé par la documentation de gcc:
Noms réservés (anglais)
Ca explique que du moment que tu mets un header, les fonctions définies par ce header deviennent des mots clé réservés. Pour les fonctions mathématiques, il est précisé qu'on doit éviter de les utiliser car elle pourraient être réservées dans le futur. Il faut donc par exemple éviter de redéfinir cos(x) comme 2 * x ... actuellement ça fonctionne, mais c'est de toute façon in-maintenable, parce que toute personne lisant le programme pensera que c'est la fonction cosinus (d'autant plus si math.h est inclus) et serait donc "trompée" par une redéfinition de cette fonction.
Mais effectivement il n'est pas précisé (ou bien je n'ai pas trouvé !) que le compilateur "connaît explicitement" 'cos', mais puisque c'est un mot 'futur-réservé' et vu qu'il fait l'optimisation, je présume qu'il connaît toutes les fonctions mathématiques même si on oublie le header math.h (du reste j'ai vérifié en redéfinissant cos comme 2 * x, et il continue bien à optimiser cos(30) en cosinus de 30 et pas en 2 * 30 !).
Bref... il faut se méfier, parfois gcc optimise trop !
(et c'est vrai, je suis obligé d'utiliser des "barrières de compilation" sur certains de mes programmes, pour qu'il ne les "casse" pas avec de la sur-optimisation, mais là c'est plus "rusé" qu'un simple 'cos' d'une constante !)
Et enfin ça marche
, ta raison Zakhar il fallait mettre le -lm à la fin.
Merci beaucoup
==> Résolu ?
Dernière modification par Zakhar (Le 10/11/2012, à 22:06)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#21 Le 10/11/2012, à 22:09
- pingouinux
Re : Problème de compilation avec "math.h"
Merci Zakhar, tes explications sont très claires.
Hors ligne
#22 Le 10/11/2012, à 22:12
- Zakhar
Re : Problème de compilation avec "math.h"
De rien... j'ai appris aussi ce soir le coup des mots-réservés via le header... on en apprend tout le temps, même en cherchant à répondre aux questions de autres.
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#23 Le 10/11/2012, à 22:17
- Simba_16
Re : Problème de compilation avec "math.h"
==> Résolu ?
Oui, problème résolu je peux continuer mon travail maintenant. Merci beaucoup.
Hors ligne
#24 Le 10/11/2012, à 23:11
- Zakhar
Re : Problème de compilation avec "math.h"
Non, je voulais juste dire que tu peux mettre "Résolu" en éditant ton premier post.
Ca permet à ceux qui répondent de se concentrer sur les sujet non résolus !
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne