Warum erhalte ich den Fehler „undefinierter Verweis auf sqrt“, obwohl ich den Header „math.h“ einfüge? [duplicate]

Lesezeit: 2 Minuten

Benutzeravatar von Ant
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

wallyks Benutzeravatar
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.

Abhijits Benutzeravatar
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

1424230cookie-checkWarum erhalte ich den Fehler „undefinierter Verweis auf sqrt“, obwohl ich den Header „math.h“ einfüge? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy