web-dev-qa-db-de.com

Warum erhalte ich den Fehler "undefined reference to sqrt", obwohl ich den Header math.h einbinde?

Ich bin sehr neu in C und ich habe diesen 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;
}

Aber wenn ich das kompiliere mit:

gcc test.c -o test

Ich erhalte folgende Fehlermeldung:

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

Warum passiert das? Befindet sich sqrt() nicht in der Header-Datei math.h? Ich erhalte den gleichen Fehler mit cosh und anderen trigonometrischen Funktionen. Warum?

89
Ant's

Die Mathematikbibliothek muss beim Erstellen der ausführbaren Datei eingebunden werden. Die Vorgehensweise ist je nach Umgebung unterschiedlich. Fügen Sie unter Linux/Unix einfach -lm Zum Befehl hinzu:

gcc test.c -o test -lm

Die Mathematikbibliothek heißt libm.so, Und die Befehlsoption -l Setzt ein lib-Präfix und ein .a - oder ein .so - Suffix voraus.

138
wallyk

Sie müssen die mit der Linker-Option -lm Verknüpfen

Sie müssen als kompilieren

gcc test.c  -o test -lm

gcc (Not g ++) würde historisch gesehen die mathematischen Funktionen beim Verknüpfen nicht standardmäßig einschließen. Es wurde auch von libc in eine separate Bibliothek libm getrennt. Um mit diesen Funktionen zu verknüpfen, müssen Sie dem Linker raten, die Linkeroption der Bibliothek -l Gefolgt vom Bibliotheksnamen m, also -lm, Einzufügen.

22
Abhijit

Dies ist wahrscheinlich ein Linkerfehler. Ergänzen Sie die -lm Schalter, um anzugeben, dass Sie eine Verknüpfung mit der Standard-C-Mathematikbibliothek (libm) herstellen möchten, die die Definition für diese Funktionen enthält (der Header hat nur die Deklaration für sie - einen Blick wert den Unterschied machen.)

7
ckhan

Weil Sie dem Linker nicht den Speicherort der math Bibliothek mitgeteilt haben. Kompiliere mit gcc test.c -o test -lm

4
tuxuday

Sie müssen die Header-Datei math.h Mit Ihrem Code verknüpfen. Sie können dies tun, indem Sie nach Ihrem Befehl -lm Eingeben.

2
Dibyendu Saha

Header hinzufügen:

#include<math.h>

Hinweis: Verwenden Sie abs (). Manchmal kann sqrt () zum Zeitpunkt der Auswertung negative Werte annehmen, die zu einem Domänenfehler führen.

abs () - liefert absolute Werte;

beispiel: abs (-3) = 3

Fügen Sie -lm am Ende Ihres Befehls während der Kompilierungszeit ein:

gcc <filename.extension> -lm

1
Akshat