2011-04-19 2 views
1

Pourquoi le code suivant me lancer une erreur référence non définie à sqrt.math.sqrt problème dans C

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int main(void) 
{ 
    double i = 25; 
    printf("\nSquare root of %d = %d",i,sqrt(i)); 
    return 0; 
} 

J'ai inclus math.h et je me sers Debian.Can quelqu'un me dire ce qui ne va pas .Ne j'installer mes bibliothèques à nouveau ou quelque chose?

+0

Veuillez inclure le message d'erreur complet et exact. Cela aidera à indiquer s'il s'agit d'un problème de compilateur ou d'éditeur de liens. Aussi, ouvrez math.h, et voyez par vous-même si sqrt est là. – abelenky

+2

Avez-vous utilisé le -lm? – Reno

+2

Modifiez les modificateurs - sqrt renvoie double, et vous avez utilisé des modificateurs int pour les deux. – Bakudan

Répondre

2

Utilisez-vous GCC? Toute "référence indéfinie" signifie qu'il y a une erreur de liaison. En d'autres termes, vous n'êtes pas correctement lié à une bibliothèque qui contient la fonction dont il se plaint. Dans ce cas, je crois que vous pouvez ajouter -lm à vos indicateurs de liens pour les lier à la bibliothèque mathématique.

7

Compilez-le avec l'indicateur -lm sur la ligne de commande pour lier à la bibliothèque mathématique.

3

Les fonctions mathématiques ne sont pas liées par défaut sur Linux (car elles sont relativement peu utilisées). Vous devez ajouter

-lm 

à votre ligne de compilation pour lier à libm.so, la bibliothèque mathématique.

+0

ne sont pas Linux pour les tech-savvy? alors la bibliothèque de maths ne devrait-elle pas être essentielle plutôt que rarement utilisée? –

+0

La raison pour laquelle la bibliothèque mathématique n'est pas liée par défaut n'est pas que les fonctions sont "rarement utilisées"; ils sont en fait utilisés plus fréquemment que beaucoup d'autres parties de la libc. Les raisons réelles sont principalement des curiosités historiques à ce stade. Essentiellement, les utilisateurs étaient historiquement plus susceptibles de vouloir utiliser des implémentations alternatives de la bibliothèque mathématique que d'autres parties de libc. –

+0

@Stephen Canon: sqrt(), sin() et log() sont-ils utilisés plus fréquemment que malloc(), printf() ou memcpy()? Je ne pense pas. Mais vous avez raison, la possibilité d'utiliser des implémentations alternatives est une autre raison pour laquelle les fonctions mathématiques ne sont pas regroupées avec libc. (Surtout au début, où tous les ordinateurs * ne possédaient pas de FPU, et les bibliothèques d'émulation différaient largement dans leurs performances et/ou leur précision.) Notez que ceci n'est pas exigé par la norme de langage, mais un détail d'implémentation sur Unixes. – DevSolar