Warum erhalte ich den Fehler „undefinierter Verweis auf sqrt“, obwohl ich den Header „math.h“ einfüge? [duplicate]
Lesezeit: 2 Minuten
Ameise
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 bekomme einen Fehler wie diesen:
/tmp/cc58XvyX.o: In function `main':
test.c:(.text+0x2f): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Warum passiert das? Ist sqrt() nicht im math.h Header-Datei? Ich bekomme den gleichen Fehler mit cosh und andere trigonometrische Funktionen. Wieso den?
Und hier ist einige Spekulation warum über warum libm ist standardmäßig nicht verlinkt, obwohl es einen Teil der Standardbibliothek enthält: stackoverflow.com/questions/1033898/…
– Michael Burr
2. Mai 2012 um 7:01 Uhr
Es ist ein Duplikat von diesem: stackoverflow.com/q/5248919/694576
– alk
2. Mai 2012 um 7:10 Uhr
Gibt es einen Grund, warum dies keinen Fehler auslöst, wenn ein Integer-Literal verwendet wird? Dh. sqrt(12345) kompiliert gut ohne -lm. Macht der Compiler die Mathematik?
– Brydon Gibson
17. Juli 2018 um 17:22 Uhr
Es funktioniert immer noch nicht, nachdem ich der akzeptierten Antwort gefolgt bin, was für eine müde Aktion für eine einfache Funktion, aber der Aufruf von sqrt() mit einer genauen Nummer funktioniert immer noch
– Phong Nguyen
31. Dezember 2018 um 9:26 Uhr
Wallyk
Die mathematische Bibliothek muss beim Erstellen der ausführbaren Datei eingebunden werden. Wie dies zu tun ist, variiert je nach Umgebung, aber unter Linux/Unix fügen Sie einfach hinzu -lm zum Befehl:
gcc test.c -o test -lm
Die Mathematikbibliothek wird benannt libm.sound die -l Befehlsoption setzt voraus, dass a lib Präfix und .a oder .so Suffix.
Abhijit
Sie müssen die mit der verknüpfen -lm Linker-Option
Sie müssen als kompilieren
gcc test.c -o test -lm
gcc (nicht g++) würde früher standardmäßig die mathematischen Funktionen beim Verknüpfen nicht einschließen. Es wurde auch von libc in eine separate Bibliothek libm getrennt. Um mit diesen Funktionen zu verknüpfen, müssen Sie den Linker anweisen, die Bibliothek einzubinden -l Linker-Option, gefolgt vom Bibliotheksnamen m daher -lm.
Dies ist wahrscheinlich ein Linker-Fehler. Ergänzen Sie die -lm Schalter, um anzugeben, dass Sie mit der Standard-Mathematikbibliothek von C verknüpfen möchten (libm), die die Definition für diese Funktionen hat (der Header hat nur die Erklärung für sie – es lohnt sich, den Unterschied nachzuschlagen.)
Weil Sie dem Linker nicht den Standort von mitgeteilt haben Mathematik Bibliothek. Kompilieren mit gcc test.c -o test -lm
Kopfzeile 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 während der Kompilierung -lm am Ende Ihres Befehls hinzu:
gcc <filename.extension> -lm
14242300cookie-checkWarum erhalte ich den Fehler „undefinierter Verweis auf sqrt“, obwohl ich den Header „math.h“ einfüge? [duplicate]yes
Und hier ist einige Spekulation warum über warum
libm
ist standardmäßig nicht verlinkt, obwohl es einen Teil der Standardbibliothek enthält: stackoverflow.com/questions/1033898/…– Michael Burr
2. Mai 2012 um 7:01 Uhr
Es ist ein Duplikat von diesem: stackoverflow.com/q/5248919/694576
– alk
2. Mai 2012 um 7:10 Uhr
Gibt es einen Grund, warum dies keinen Fehler auslöst, wenn ein Integer-Literal verwendet wird? Dh.
sqrt(12345)
kompiliert gut ohne-lm
. Macht der Compiler die Mathematik?– Brydon Gibson
17. Juli 2018 um 17:22 Uhr
Es funktioniert immer noch nicht, nachdem ich der akzeptierten Antwort gefolgt bin, was für eine müde Aktion für eine einfache Funktion, aber der Aufruf von sqrt() mit einer genauen Nummer funktioniert immer noch
– Phong Nguyen
31. Dezember 2018 um 9:26 Uhr