Probleme avec sqrtf

Résolu
hoho26 Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
 Perla -
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   Statut Membre Dernière intervention   148
 
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
laura
 
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
laura
 
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
Qestionnn
 
Moi j'ai pas compris ce qu'il faut faire!
UPMC en force yeah! XD
1
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
Tu dois lier libmath avec ton fichier objet avec l'option -lm:
johand@osiris: ~/src/CCM/C $ cat sqrtf-test.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
  float two = 2.0;
  printf("The square root of %f is %10.10g\n", two, sqrtf(two) );
  return(EXIT_SUCCESS);
}
johand@osiris: ~/src/CCM/C $ gcc -Wall -lm  -o sqrtf-test sqrtf-test.c 
johand@osiris: ~/src/CCM/C $ ./sqrtf-test 
The square root of 2.000000 is 1.414213538
1
Perla
 
Bon ben moi j'ai aussi trouvé comment faire! J'ai tout simplement mis -lm à la deuxième ligne du make! (la première est un commentaire) . Et ça marche! Le problème c'est que maintenant j'ai une autre erreur! Il reconnaît pas mon chercher_ligne dans liste.c alors que les inclusions des headers ont bien été faites...
0