Menu

Probleme avec sqrtf [Résolu/Fermé]

hoho26 1 Messages postés mercredi 7 décembre 2011Date d'inscription 7 décembre 2011 Dernière intervention - 7 déc. 2011 à 22:52 - Dernière réponse :  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;

}
Afficher la suite 

6 réponses

Meilleure réponse
loupius 698 Messages postés dimanche 1 novembre 2009Date d'inscription 31 décembre 2017 Dernière intervention - 8 déc. 2011 à 03:28
3
Merci
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.

Merci loupius 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

CCM a aidé 24455 internautes ce mois-ci

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?
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

:)
1
Merci
Moi j'ai pas compris ce qu'il faut faire!
UPMC en force yeah! XD
jisisv 3662 Messages postés dimanche 18 mars 2001Date d'inscriptionModérateurStatut 15 janvier 2017 Dernière intervention - 12 déc. 2011 à 23:35
1
Merci
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
0
Merci
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...