Undefinierter Verweis auf pow( ) in C trotz Einbeziehung von math.h [duplicate]

Lesezeit: 2 Minuten

Benutzeravatar von Ian Knight
Jan Ritter

Mögliches Duplikat:

Problem bei der Verwendung von pow() in C
was ist ‘undefinierter bezug auf ‘pow’

Ich habe ein kleines Problem mit einer einfachen Kursarbeit für die Uni, die mich wirklich verwirrt.

Im Wesentlichen muss ich ein Programm schreiben, das unter anderem das Volumen einer Kugel aus einem gegebenen Radius berechnet. Ich dachte, ich würde die verwenden pow() funktionieren statt nur zu benutzen r*r*rfür zusätzliche Brownie-Punkte, aber der Compiler gibt mir immer wieder den folgenden Fehler:

undefinierter Verweis auf „pow“ collect2: Fehler: ld gab 1 Exit-Status zurück

Mein Code sieht wie folgt aus:

#include <math.h>

#define PI 3.14159265 //defines the value of PI

/* Declare the functions */
double volumeFromRadius(double radius);

/* Calculate the volume of a sphere from a given radius */
double volumeFromRadius(double radius) {
    return (4.0/3.0) * PI * pow(radius,3.0f);
}

und ich kompiliere mit dem Befehl gcc -o sphere sphere.c

Dies kompiliert und läuft gut in code::blocks auf den Windows-Rechnern an der Uni, aber auf meinem Fedora 17 zu Hause weigert sich der Befehlszeilen-Compiler zu laufen. Alle mögliche Gedanken würden dankbar geschätzt!

Segen, Ian

Sie müssen mit der Mathematikbibliothek verknüpfen:

gcc -o sphere sphere.c -lm

Der Fehler, den Sie sehen: error: ld returned 1 exit status stammt vom Linker ld (Teil von gcc, der die Objektdateien kombiniert), weil es nicht finden kann, wo sich die Funktion befindet pow ist definiert.

Einschließlich math.h bringt die Deklaration der verschiedenen Funktionen ein und nicht ihre Definition. Die def ist in der Mathematikbibliothek vorhanden libm.a. Sie müssen Ihr Programm mit dieser Bibliothek verknüpfen, damit die Aufrufe von Funktionen wie pow() aufgelöst werden.

  • Dies hat mein Problem gelöst. Trotzdem habe ich 2 Ubuntu 20.04 Boxen mit Code::Blocks als IDE installiert. Man kompiliert den Quellcode (inklusive Mathe-Funktionen) ordentlich ohne -lmund die anderen Bedürfnisse -lm. Wie lässt sich die zweite Box ohne kompilieren -lm?

    – geohei

    24. September 2020 um 7:17 Uhr


  • @geohei, wahrscheinlich kompiliert ein Fenster im Release und das andere im Debug. Es scheint, dass das Kompilieren in der Version mit Codeblöcken nicht erforderlich ist -lm.

    – Alessandro Muntoni

    26. November 2020 um 16:11 Uhr


  • Können Sie auf was erweitern -lm tut genau? Ich habe keine Informationen zu diesem Flag in den GCC-Online-Dokumenten gefunden, und man gcc.

    – Ichigolas

    7. April um 18:48 Uhr

  • @ichigolas ziemlich spät für eine Antwort, aber fürs Protokoll: -l bedeutet Binärbibliotheken, die beim Linken zu berücksichtigen sind. Was auch immer danach kommt -l wird standardmäßig als Teil eines Dateinamens interpretiert, der mit beginnt lib und endet in .a. Somit -lm bedeutet Verknüpfung libm.a

    – Raffael

    27. April um 17:16 Uhr


  • Wie dumm, dass es -lm statt -lmath ist.

    – TyR

    17. September um 16:42 Uhr

1423170cookie-checkUndefinierter Verweis auf pow( ) in C trotz Einbeziehung von math.h [duplicate]

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

Privacy policy