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?
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
.
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
.
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.)
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
Vous devez associer le fichier d'en-tête math.h
à votre code. Vous pouvez le faire en tapant -lm
après votre commande.
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