Undefinierter Verweis auf sqrt (oder andere mathematische Funktionen)

Lesezeit: 5 Minuten

Benutzeravatar von Waypoint
Wegpunkt

Ich habe diesen einfachen Code:

max = (int) sqrt (number);

und in der Überschrift habe ich:

#include <math.h>

Aber die Anwendung sagt immer noch einen undefinierten Verweis auf sqrt. Sehen Sie hier ein Problem? Es sieht so aus, als ob alles in Ordnung sein sollte.

  • Was beschwert sich, der Linker oder der Compiler? Wenn Sie den genauen Fehler posten können, würde das wahrscheinlich die Dinge klären.

    – Tommi

    9. März 2011 um 16:36 Uhr

  • Compiler schreibe diese Beschwerde, Problem ist, dass die App nicht einmal gebaut wird …

    – Wegpunkt

    9. März 2011 um 16:40 Uhr


  • Das Problem liegt nicht in Ihrem Programm, sondern in der Implementierung der C-Bibliothek in Ihrem System. Es folgt immer noch den Legacy-Konventionen der 1970er/1980er Jahre, bei denen sich die mathematischen Funktionen in einer separaten Bibliothek befinden und nicht standardmäßig verknüpft sind.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    9. März 2011 um 18:52 Uhr

  • Siehe auch: stackoverflow.com/questions/1033898/…

    – Nate Eldredge

    10. Februar 2021 um 23:35 Uhr

Benutzeravatar von paxdiablo
paxdiablo

Möglicherweise müssen Sie auf dem von Ihnen verwendeten System eine Verknüpfung mit den mathematischen Bibliotheken herstellen, z. B.:

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.

Das Einschließen von Headern informiert einen Compiler über Funktionsdeklarationen, tut es aber nicht notwendigerweise automatisch mit dem Code verknüpfen, der zum Ausführen dieser Funktion erforderlich ist.

Andernfalls müssen Sie uns Ihren Code, Ihren Kompilierbefehl und die Plattform zeigen, auf der Sie laufen (Betriebssystem, Compiler usw.).

Der folgende Code lässt sich gut kompilieren und verknüpfen:

#include <math.h>
int main (void) {
    int max = sqrt (9);
    return 0;
}

Seien Sie sich dessen bewusst etwas Kompilierungssysteme hängen von der Reihenfolge ab, in der Bibliotheken auf der Befehlszeile angegeben werden. Damit meine ich, dass sie die Bibliotheken nacheinander verarbeiten und sie nur verwenden können, um nicht aufgelöste Symbole zu erfüllen an diesem Punkt in der Sequenz.

Also zum Beispiel bei gegebenen Befehlen:

gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o

und plugh.o erfordert etwas von der xyzzy Bibliothek, die zweite funktioniert möglicherweise nicht wie erwartet. An dem Punkt, an dem Sie die Bibliothek auflisten, müssen keine ungelösten Symbole erfüllt werden.

Und wenn die ungelösten Symbole aus plugh.o tun erscheinen, es ist zu spät.

  • @paxdiablo : und im Fall von µClibc für csqrt?

    – Benutzer2284570

    18. Mai 2015 um 23:37 Uhr


  • Achten Sie auch auf die Reihenfolge der verlinkten Bibliotheken. Ich habe festgestellt, dass ich -lm zu früh in der Befehlszeile hatte und dass das Verschieben an das Ende verwandte Fehlermeldungen löst. Dies scheint auch von der gcc-Version abhängig zu sein (einige ältere Versionen hatten nicht so viel dagegen).

    – Kevin Bullaughey

    10. Juli 2015 um 2:50 Uhr

  • @Gabriel, ich dachte, mein letzter Abschnitt (“Sei dir nur bewusst …”) deckte das ab. Jedenfalls ist es nicht so, dass es an letzter Stelle stehen muss, es kann einfach nicht vor etwas stehen, was ausschließlich Dinge von ihm braucht. Damit meine ich user_of_sin -lm user_of_cos user_of_xx -lprovider_of_xx ist für alles in Ordnung, außer cos (vorausgesetzt sin und cos sind getrennt Objekte in der Bibliothek). Zugegeben, das letzte ist wahrscheinlich der sicherste Ort, um es zu platzieren (vorausgesetzt, es braucht nichts), aber ich fühle mich heute pedantisch 🙂

    – paxdiablo

    14. März um 4:06


  • @paxdiablo, danke für die Klarstellung. Ja, Ihr zusätzlicher Kommentar ist pedantisch richtig (bedeutet technisch korrekt), während mein Kommentar ist praktisch richtig (bedeutet: richtig als allgemeine Faustregel im praktischen Sinne). Ich kann mir keine Fälle vorstellen, in denen nur alle Bibliotheken zuletzt abgelegt werden würden nicht funktional sein und was Sie wollen, obwohl, technischwie Sie sagten, muss die Bibliothek nur direkt nach der Objektdatei oder Quelldatei kommen, die sie benötigt.

    – Gabriel Staples

    14. März um 4:27


  • @Gabriel, keine Probleme. Ich stimme zu, dass alle Bibliotheken nach allen Objekten kommen sollten. ich haben wurde zuvor durch zirkuläre Bibliotheksabhängigkeiten verbrannt, was eine Monstrosität wie erforderte -laaa -lbbb -laaa um sicherzustellen, dass die Abhängigkeiten aufgelöst werden. Ich habe sogar Fälle gesehen, in denen dieser Roundtrip mehrmals erforderlich war, wenn verschiedene Objekte innerhalb der Bibliotheken komplexe zirkuläre Abhängigkeiten hatten. Ich weiß nicht, warum GNU ld hat nicht nur zumindest eine bereitgestellt Möglichkeit um zu zuvor gegebenen Bibliotheken zurückzukehren, um neue ungelöste Symbole zu erfüllen.

    – paxdiablo

    14. März um 4:35 Uhr

Ich nehme an, Sie haben math.h mit importiert #include <math.h>

Der einzige andere Grund, den ich sehen kann, ist a fehlende Verknüpfungsinformationen. Sie müssen Ihren Code mit der verknüpfen -lm Möglichkeit.

Wenn Sie nur versuchen, eine Datei mit gcc zu kompilieren, fügen Sie einfach hinzu -lm zu Ihrer Befehlszeile, geben Sie andernfalls einige Informationen über Ihren Bauprozess ein.

Benutzeravatar von Hassan Rahman
Hassan Rahm

Fügen Sie einfach die hinzu #include <math.h> in c-Quelldatei und -lm in Makefile am Ende funktionieren für mich.

    gcc -pthread -o p3 p3.c -lm

Hier sind meine Beobachtungen: Zuerst müssen Sie den Header einfügen math.h wie sqrt() Funktion deklariert in math.h Header-Datei. Für zB

#include <math.h>

Zweitens, wenn Sie die Handbuchseite von lesen quadrat Sie werden diese Linie bemerken Mit -lm verlinken.

#include <math.h> /* header file you need to include */

double sqrt(double x); /* prototype of sqrt() function */

Link with -lm. /* Library linking instruction */

Aber die Anwendung sagt immer noch einen undefinierten Verweis auf sqrt. Sehen Sie hier ein Problem?

Der Compilerfehler ist korrekt, da Sie Ihr Programm nicht mit der Bibliothek verknüpft haben lm & Linker kann keine Referenz von finden sqrt(), müssen Sie es explizit verlinken. Für zB

gcc -Wall -Wextra -Werror -pedantic test.c -lm

Ich hatte das gleiche Problem, aber ich habe es einfach gelöst, indem ich -lm nach dem Befehl hinzugefügt habe, der meinen Code ausführt. Beispiel. gcc-Code.c -lm

  • Wie unterscheidet sich das von den anderen Antworten, die vor einigen Jahren gepostet wurden?

    – Grooveplex

    28. Juli 2019 um 21:28 Uhr

  • Wie unterscheidet sich das von den anderen Antworten, die vor einigen Jahren gepostet wurden?

    – Grooveplex

    28. Juli 2019 um 21:28 Uhr

1418880cookie-checkUndefinierter Verweis auf sqrt (oder andere mathematische Funktionen)

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

Privacy policy