webentwicklung-frage-antwort-db.com.de

undefinierter Verweis auf sqrt (oder andere mathematische Funktionen)

Ich habe diesen einfachen Code:

max = (int) sqrt (number);

und in der Kopfzeile habe ich:

#include <math.h>

Die Anwendung sagt jedoch immer noch undefinierte Verweise auf sqrt. Sehen Sie hier ein Problem? Es sieht so aus, als sollte alles in Ordnung sein.

51
Waypoint

Möglicherweise müssen Sie mit den Mathematikbibliotheken auf jedem System, das Sie verwenden, eine Verbindung herstellen.

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

Durch das Einschließen von Headern kann ein Compiler Funktionsdeklarationen erfahren, not führt jedoch automatisch eine Verknüpfung zu dem für diese Funktion erforderlichen Code.

Andernfalls müssen Sie uns Ihren Code, Ihren Kompilierungsbefehl und die Plattform, auf der Sie ausgeführt werden (Betriebssystem, Compiler usw.), anzeigen.

Der folgende Code wird kompiliert und verlinkt:

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

Beachten Sie, dass einige Kompilierungssysteme von der Reihenfolge abhängen, in der Bibliotheken in der Befehlszeile angegeben werden. Damit meine ich, dass sie die Bibliotheken nacheinander verarbeiten und sie nur verwenden können, um nicht aufgelöste Symbole an diesem Punkt in der Folge zu erfüllen.

So zum Beispiel die Befehle gegeben:

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, gibt es keine nicht aufgelösten Symbole, die Sie erfüllen müssen.

Und wenn die nicht aufgelösten Symbole aus plugh.odo erscheinen, ist es zu spät.

83
paxdiablo

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

Der einzige andere Grund, den ich sehen kann, ist eine fehlende Verknüpfungsinformation . Sie müssen Ihren Code mit der Option -lm verknüpfen.

Wenn Sie lediglich versuchen, eine Datei mit gcc zu kompilieren, fügen Sie einfach -lm in Ihre Befehlszeile ein. Andernfalls geben Sie Informationen zu Ihrem Bauprozess an.

23
krtek

Das Hinzufügen von #include <math.h> in c-Quelldatei und -lm in Makefile am Ende wird für mich funktionieren.

    gcc -pthread -o p3 p3.c -lm
2
Hassan Rahman

Hier ist meine Beobachtung: Zuerst müssen Sie die Header-Funktion math.h Als sqrt() deklarieren, die in der Header-Datei math.h Deklariert ist. Für z.B.

#include <math.h>

zweitens, wenn Sie die Manualpage von sqrt lesen, werden Sie diese Zeile bemerken Link mit -lm.

#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 undefinierten Verweis auf sqrt. Sehen Sie hier ein Problem?

Der Compilerfehler ist korrekt, da Sie Ihr Programm nicht mit der Bibliothek lm verknüpft haben und der Linker die Referenz von sqrt() nicht finden kann. Sie müssen sie explizit verknüpfen. Für z.B.

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

Ich hatte das gleiche Problem, aber ich habe es einfach gelöst, indem -lm nach dem Befehl hinzugefügt wurde, mit dem mein Code ausgeführt wird. Beispiel. gcc code.c -lm

0
Mohamed Mnete