Probleme avec sqrtf

Résolu/Fermé
hoho26 Messages postés 1 Date d'inscription mercredi 7 décembre 2011 Statut Membre Dernière intervention 7 décembre 2011 - 7 déc. 2011 à 22:52
 Perla - 13 déc. 2011 à 17:03
Bonjour,

Mon probleme est que quand je compile mon fichier lors de la compilation j'ai comme message sur le terminal:

liste.c:244: undefined reference to 'sqrtf'

et je sais que cette fonction est dans math.h pourtant j'ai toujours cette erreur merci de m'aider voici le code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include "ligne.h"
#include "truc.h"
#include "liste.h"
#include "coord.h"
#include "station.h"
#include "abr.h"
#include "connexion.h"
#include "abr_type.h"
#define MAX_LIGNE 256

.
.
.
.
Un_elem *lire_connexions(char *nomfichier,Une_ligne *liste_ligne,Un_nabr *abr_sta) {
Un_elem *liste=NULL;
FILE *f;
char ligne [MAX_LIGNE];

if((f=fopen(nomfichier,"r"))==NULL) {
fprintf(stderr,"erreur");
return NULL;
}
while(fgets(ligne,MAX_LIGNE,f)) {
Une_coord coord;
Tdata data;
char *pc=ligne;
char *code;
char*nom_dep;
char*nom_arr;
float val;
Un_truc *connex,*sta_dep;
if(*ligne =='#') continue;
code=pc;
while(*pc!=';')pc++;
*pc++='\0';
nom_dep=pc;
while(*pc!=';')pc++;
*pc++='\0';
nom_arr=pc;
while(*pc!=';')pc++;
*pc++='\0';
val=atof(pc);
Une_ligne *nico;
nico=chercher_ligne(liste_ligne,code);
if((data.con.ligne=nico)==NULL) {
fprintf(stderr,"erreur");
continue;
}
if((data.con.sta_dep=chercher_station(abr_sta,nom_dep))==NULL) {
fprintf(stderr,"erreur");
continue;
}
if((data.con.sta_dep=chercher_station(abr_sta,nom_arr))==NULL) {
fprintf(stderr,"erreur");
continue;
}
//calcul valeur arc
if(val==0.0) {
Une_coord cdep,carr;
float dx,dy;

cdep=data.con.sta_dep->coord;
carr=data.con.sta_arr->coord;
dx=((carr.lon-cdep.lon)*M_PI*6370/180);
dy=((carr.lat-cdep.lat)*M_PI*6370/180);

val=60*(sqrtf(dx*dx+dy*dy))/data.con.ligne->vitesse; //ligne de code 244

connex=creer_truc(coord,CON,data,val);
//ajout station depart
sta_dep=data.con.sta_dep;
(sta_dep->data.sta.nb_con)++;
sta_dep->data.sta.tab_con=realloc(sta_dep->data.sta.tab_con,sta_dep->data.sta.nb_con*sizeof(Un_elem*));
sta_dep->data.sta.tab_con[sta_dep->data.sta.nb_con-1]=connex;
//ajoute liste connexions
liste=inserer_deb_liste(liste,connex);
}
}
return liste;

}

4 réponses

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
8 déc. 2011 à 03:28
Problème classique !
Il ne suffit pas d'indiquer 'math.h' dans un fichier source car celui-ci n'est qu'un fichier de renseignements destiné au compilateur, il faut aussi indiquer au linker dans quelle bibliothèque se trouvent les fonctions correspondantes.
En général un ajout de '-lm' sur la ligne de commande résoud le problème.
Bonne continuation.
3
J'ai le même soucis, seulement je pense que je ne place pas ce -lm au bon endroit dans la ligne de commande.
Dans mon makefile je fais entre autre:

liste.o : liste.c
gcc ${C_FLAGS} -c liste.c

test_sta : test_sta.o ligne.o liste.o truc.o abr.o station.o
gcc ${C_FLAGS} -lm -o test_sta test_sta.o truc.o ligne.o liste.o abr.o station.o

Sachant que l'appel à sqrt est dans liste.c

Où est donc l'erreur?
0
J'ai trouvé!
Il faut écrire à chaque ligne de commande qui dépend de liste.o -lm A LA FIN de la ligne de commande!

test_sta : test_sta.o ligne.o liste.o truc.o abr.o station.o
gcc ${C_FLAGS} -o test_sta test_sta.o truc.o ligne.o liste.o abr.o station.o -lm

:)
0