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?
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.
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.
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.)
Weil Sie dem Linker nicht den Speicherort der math Bibliothek mitgeteilt haben. Kompiliere mit gcc test.c -o test -lm
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.
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