Waarom krijg ik een undefined reference to sqrt -fout ondanks dat ik de math.h-header gebruik?

Ik ben erg nieuw bij C en ik heb deze 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;
}

Maar als ik dit compileer met:

gcc test.c -o test

Ik krijg een foutmelding als deze:

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

Waarom gebeurt dit? Staat sqrt() niet in het math.h headerbestand? Ik krijg dezelfde fout met cosh en andere trigonometrische functies. Waarom?


Antwoord 1, autoriteit 100%

De wiskundebibliotheek moet worden gekoppeld bij het bouwen van het uitvoerbare bestand. Hoe u dit doet, verschilt per omgeving, maar in Linux/Unix voegt u gewoon -lm toe aan het commando:

gcc test.c  -o test -lm

De wiskundebibliotheek heet libm.so, en de opdrachtoptie -l gaat uit van een lib-prefix en .a of .so achtervoegsel.


Antwoord 2, autoriteit 16%

Je moet de link koppelen met de -lm linker optie

Je moet compileren als

gcc test.c  -o test -lm

gcc (Niet g++) zou historisch gezien standaard de wiskundige functies niet opnemen tijdens het koppelen. Het is ook gescheiden van libc op een aparte bibliotheek libm. Om met deze functies te linken moet je de linker adviseren om de bibliotheek -l linker optie op te nemen gevolgd door de bibliotheeknaam m dus -lm.


Antwoord 3, autoriteit 5%

Dit is waarschijnlijk een linkerfout.
Voeg de schakeloptie -lm toe om aan te geven dat u een koppeling wilt maken met de standaard C-wiskundebibliotheek (libm) die de definitie voor die functies heeft (de kop heeft alleen de verklaring voor hen – de moeite waard om het verschil op te zoeken.)


Antwoord 4, autoriteit 3%

Omdat je de linker niet hebt verteld over de locatie van de wiskunde bibliotheek. Compileer met gcc test.c -o test -lm


Antwoord 5

Koptekst toevoegen:

#include<math.h>

Opmerking: gebruik abs(), soms kan sqrt() tijdens de evaluatie negatieve waarden aannemen die leiden tot domeinfouten.

abs()- geeft absolute waarden;

voorbeeld, abs(-3) =3

Voeg -lm toe aan het einde van uw opdracht tijdens de compilatietijd:

gcc <filename.extension> -lm

LEAVE A REPLY

Please enter your comment!
Please enter your name here

eighteen − seven =

Other episodes