2010-03-15 12 views
0

Je ne comprends pas pourquoi cela jette référence non définie à `étage » « :étage double (time_t)

double curr_time = (double)time(NULL); 
return floor(curr_time); 

ne l'a pas été casté en double, qui est ce que étage reçoit

? ?
+3

Avez-vous # compris ? – zellio

+3

Avez-vous lié la bibliothèque mathématique (par exemple, -lm pour gcc)? Les erreurs de "référence indéfinie" indiquent généralement que le lieur ne peut pas trouver le code objet pour quelque chose. –

+3

Les erreurs de référence non définies proviennent de l'éditeur de liens, l'en-tête manquant devrait être une erreur de compilation. – dirkgently

Répondre

7

vous avez peut-être courir pour le problème -lm infâme. Compil e que:

gcc yourfile.c -o out -lm 

Ceci est C FAQ 14.3 article ainsi.

+1

Les indicateurs de liaison de bibliothèque doivent aller après les sources et les fichiers objets, btw. – wRAR

5

peut-être parce que vous ne liez pas avec la bibliothèque mathématique l'erreur n'a rien à voir avec des moulages et des types de données, btw

+0

Ce que je ne comprends pas, c'est pourquoi, sans lien avec la bibliothèque mathématique, des choses comme floor (1.2) _do_ ont fonctionné. C'est pourquoi je pensais que l'erreur était liée au type de données. – plok

+0

@plok: Peut-être que cela a fonctionné, parce que vous étiez sur un système différent? Parfois, la bibliothèque est liée par défaut. – Lucas

+0

@Lucas: c'était sur le même système, sans rien modifier. J'ai juste essayé avec une déclaration plus simple quand l'erreur a été lancée et vu que l'étage (1.2) fonctionnait. Est-il possible que le résultat soit calculé par gcc au moment de la compilation? – plok

2

Vous devez probablement lier explicitement à la bibliothèque. Sur un système de type UNIX, ce serait typiquement "/usr/lib/libm.a". La bibliothèque standard C doit être liée par défaut, mais la bibliothèque mathématique ne dépend pas de votre système et vous devrez peut-être lier explicitement. (par exemple sur Mac OS X, il est également lié par défaut sur mon système ubuntu ce n'est pas le cas).

Notez que cela n'a rien à voir avec votre chemin d'inclusion. Si vous êtes sur quelque chose comme UNIX, vous trouverez probablement l'en-tête avec la déclaration du prototype sous "/usr/include/math.h", où votre compilateur recherchera toujours les en-têtes.

Si vous utilisez gcc, vous pouvez soit un lien direct avec:

gcc yourfile.c /usr/lib/libm.a -o out 

ou "-l nameroflibrary" comme ceci:

gcc yourfile.c -lm -o out 

ce cherchera une bibliothèque le même répertoire que la bibliothèque standard C avec le nom "lib nameoflibrary .a"