web-dev-qa-db-fra.com

Pourquoi est-ce que je reçois une erreur "référence non définie à sqrt" alors que j'inclue 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 ceci 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 arrive-t-il? sqrt() ne figure-t-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?

89
Ant's

La bibliothèque de mathématiques doit être liée lors de la construction de l'exécutable. La procédure à suivre varie d’un environnement à l’autre, mais sous Linux/Unix, ajoutez simplement -lm à la commande:

gcc test.c -o test -lm

La bibliothèque mathématique s'appelle libm.so, et l'option de commande -l suppose un préfixe lib et un suffixe .a ou .so.

138
wallyk

Vous devez lier l’option avec l’éditeur de liens -lm

Vous devez compiler en tant que

gcc test.c  -o test -lm

gcc (pas g ++) historiquement, n'incluait pas par défaut les fonctions mathématiques lors de la liaison. Il a également été séparé de libc sur une bibliothèque séparée libm. Pour créer un lien avec ces fonctions, vous devez demander à l'éditeur de liens d'inclure l'option bibliothèque -l de l'éditeur de liens suivie du nom de la bibliothèque m et donc -lm.

22
Abhijit

C'est probablement une erreur de l'éditeur de liens. Ajoutez le commutateur -lm pour indiquer que vous souhaitez établir un lien avec la bibliothèque mathématique C standard (libm) qui contient la définition de ces fonctions (l'en-tête contient simplement déclaration pour les - vaut la peine de regarder la différence.)

7
ckhan

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

4
tuxuday

Vous devez associer le fichier d'en-tête math.h à votre code. Vous pouvez le faire en tapant -lm après votre commande.

2
Dibyendu Saha

Ajouter un en-tête:

#include<math.h>

Remarque: utilisez abs (), parfois au moment de l’évaluation, sqrt () peut prendre des valeurs négatives qui laissent une erreur de domaine.

abs () - fournit des valeurs absolues;

exemple, abs (-3) = 3

Incluez -lm à la fin de votre commande pendant la compilation:

gcc <filename.extension> -lm

1
Akshat