148 votes

Pourquoi est-ce que je reçois "référence non définie à sqrt" erreur même si j'inclus l'en-tête math.h ?

Je suis très nouveau en C et j'ai ce code :

#include <stdio.h>
#include <math.h>
int main(void)
{
  double x = 0.5;
  double result = sqrt(x);
  printf("The square root of %lf is %lf\n", x, result);
  return 0;
}

Mais quand je compile ça avec :

gcc test.c -o test

Je reçois une erreur comme celle-ci :

/tmp/cc58XvyX.o: In function `main':
test.c:(.text+0x2f): undefined reference to `sqrt'
collect2: ld returned 1 exit status

Pourquoi cela se produit-il ? sqrt() n'est-il pas dans le fichier d'en-tête math.h ? Je reçois la même erreur avec cosh et d'autres fonctions trigonométriques. Pourquoi ?

227voto

wallyk Points 33150

La bibliothèque de mathématiques doit être liée lors de la construction de l'exécutable. Comment faire cela varie selon l'environnement, mais dans Linux/Unix, ajoutez simplement -lm à la commande :

gcc test.c -o test -lm

La bibliothèque de mathématiques est nommée libm.so, et l'option de commande -l suppose un préfixe lib et un suffixe .a .so.

38voto

Abhijit Points 24122

Vous devez lier le à l'option -lm linker

Vous devez compiler comme

gcc test.c  -o test -lm

gcc (Not g++) n'inclurait pas par défaut les fonctions mathématiques lors de la liaison. Il a également été séparé de libc sur une librairie libm séparée. Pour lier avec ces fonctions, vous devez conseiller à l'éditeur de liens d'inclure l'option d'éditeur de liens -l suivie par le nom de la bibliothèque m donc -lm.

12voto

ckhan Points 3370

Il s'agit probablement d'une erreur de linker. Ajoutez le commutateur -lm pour spécifier que vous souhaitez lier avec la bibliothèque de mathématiques C standard (libm) qui a la définition pour ces fonctions (l'en-tête a juste la déclaration pour eux - il vaut la peine de regarder la différence.)

6voto

tuxuday Points 1676

Parce que vous n'avez pas parlé à l'éditeur de lien de l'emplacement de la bibliothèque de maths. Compiler avec gcc test.c -o test -lm

6voto

Akshat Points 71

Ajouter un en-tête :

#include<math.h>

Note : utilisez abs(), parfois au moment de l'évaluation sqrt() peut prendre des valeurs négatives qui laissent à l'erreur de domaine

.

abs()- fournit des valeurs absolues ;

exemple, abs(-3) =3

Inclure -lm à la fin de votre commande pendant le temps de compilation :

gcc <filename.extension> -lm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X