Undefinierter Verweis auf `pow’ und `floor’

Lesezeit: 5 Minuten

Benutzeravatar von Gabriele Cirulli
Gabriele Cirulli

Ich versuche, einen einfachen Fibonacci-Rechner in C zu erstellen, aber beim Kompilieren gcc sagt mir, dass mir die Pow- und Bodenfunktionen fehlen. Was ist los?

Code:

#include <stdio.h>
#include <math.h>

int fibo(int n);

int main() {
        printf("Fib(4) = %d", fibo(4));
        return 0;
}

int fibo(int n) {
        double phi = 1.61803399;

        return (int)(floor((float)(pow(phi, n) / sqrt(5)) + .5f));
}

Ausgabe:

[email protected]:~/work/c/fibo$ gcc fib.c -o fibo
/tmp/ccNSjm4q.o: In function `fibo':
fib.c:(.text+0x4a): undefined reference to `pow'
fib.c:(.text+0x68): undefined reference to `floor'
collect2: ld returned 1 exit status

  • Da die Fließkommapräzision nicht unendlich ist, gibt dies falsche Antworten für nicht so große Werte von n

    – Vonbrand

    20. Januar 2013 um 5:14 Uhr

  • Mögliches Duplikat eines undefinierten Verweises auf sqrt (oder andere mathematische Funktionen)

    – Toby Speight

    2. Mai 2018 um 8:48 Uhr

  • Es scheint, dass es eine noch einfachere Lösung gibt, verwenden Sie stattdessen einfach g++: g++ fib.c -o fibo

    – OrenIshShalom

    29. Juli 2018 um 14:46 Uhr

Freds Benutzeravatar
Fred

Sie müssen mit dem Link-Flag kompilieren -lmso was:

gcc fib.c -lm -o fibo

Dadurch wird gcc angewiesen, Ihren Code mit der mathematischen Bibliothek zu verknüpfen. Stellen Sie einfach sicher, dass Sie die Flagge setzen nach die Objekte, die Sie verknüpfen möchten.

  • Könnten Sie bitte erklären, wie Sie den Buchstaben nach -l ausarbeiten?

    – Gabriele Cirulli

    29. Dezember 2011 um 20:12 Uhr


  • Suchen Sie in /lib oder /usr/lib. Die Bibliotheken sind alle benannt lib<name>.a oder lib<name>.so – Es ist das ““, das Sie nach dem setzen -l. In diesem Fall wird die Mathematikbibliothek benannt libm.soso nennen wir es -lm.

    – ams

    29. Dezember 2011 um 21:10 Uhr

  • Vielen Dank! Ich habe in den letzten 30 Minuten gegoogelt und dies ist die erste Referenz, die besagt, dass die Bibliotheken nach den Objekten verknüpft werden sollen

    – Dave Baghdanov

    6. November 2013 um 22:13 Uhr

  • Als Antwort auf den Kommentar von @GabrieleCirulli (von vor langer Zeit; sorry an @ you now!) möchte ich hinzufügen, dass eine andere Möglichkeit, dies herauszufinden, darin besteht, sich die Manpage für die betreffende Funktion und insbesondere den Mann anzusehen Seite in Abschnitt 3 des Handbuchs – dh Typ man 3 floor und/oder man 3 powund sie sollten jeweils die erwähnen -lm Linker-Flag.

    – Linde

    8. Februar um 3:07

  • @KenIngram: das sieht aus wie eine C++-Version des Headers … gültig für C++, aber ein Nicht-C++-C-Compiler wird wahrscheinlich daran ersticken (gcc tut, für mich, aber g++ kommt damit gut zurecht.)

    – Linde

    8. Februar um 3:09

Benutzeravatar von Yann Droneaud
Yann Droneaud

Fügen Sie -lm zu Ihren Linkoptionen hinzu, da pow() und floor() Teil der mathematischen Bibliothek sind:

gcc fib.c -o fibo -lm

Benutzeravatar von spike.barnett
spike.barnett

Für alle, die dies später lesen, müssen Sie dagegen verlinken, wie Fred sagte:

gcc fib.c -lm -o fibo

Eine gute Möglichkeit, herauszufinden, welche Bibliothek Sie verknüpfen müssen, besteht darin, die Manpage zu überprüfen, falls vorhanden. Zum Beispiel, man pow und man floor werden dir beide sagen:

Verbinden mit -lm.

Eine Erklärung zum Verknüpfen von Mathematikbibliotheken in der C-Programmierung – Verknüpfen in C

In Bezug auf die Antwort von Fuzzy:

Eigentlich musste ich etwas anders machen.

Projekt -> Eigenschaften -> C/C++ Build -> Einstellungen -> GCC C Linker -> Bibliotheken

Klicken Sie auf das kleine grüne Hinzufügen-Symbol, geben Sie m ein und klicken Sie auf OK. Auf alles in diesem Fenster wird automatisch -l angewendet, da es sich um eine Bibliothek handelt.

Den Punkt zu finden, an dem das -lm in der Eclipse-IDE hinzugefügt werden muss, ist wirklich schrecklich, also hat es einige Zeit gedauert.

Wenn jemand anderes auch Edlipse verwendet, können Sie den Befehl folgendermaßen hinzufügen:

Project -> Properties -> C/C++ Build -> Settings -> GCC C Linker -> Miscelleaneous -> Linker flags: Fügen Sie in diesem Feld den Befehl -lm hinzu

Benutzeravatar von bladekp
Klingekp

Alle obigen Antworten sind unvollständig, das Problem liegt hier im Linker ld eher als Compiler collect2: ld returned 1 exit status. Wenn Sie Ihre kompilieren fib.c widersprechen:

$ gcc -c fib.c
$ nm fib.o
0000000000000028 T fibo
                 U floor
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T main
                 U pow
                 U printf

Wo nm listet Symbole aus der Objektdatei auf. Sie können sehen, dass dies ohne Fehler kompiliert wurde, aber pow, floorund printf Funktionen haben undefinierte Referenzen, wenn ich jetzt versuchen werde, dies mit der ausführbaren Datei zu verknüpfen:

$ gcc fib.o
fib.o: In function `fibo':
fib.c:(.text+0x57): undefined reference to `pow'
fib.c:(.text+0x84): undefined reference to `floor'
collect2: error: ld returned 1 exit status

Ich bekomme eine ähnliche Ausgabe wie Sie. Um das zu lösen, muss ich dem Linker mitteilen, wo er nach Verweisen suchen soll powund floorzu diesem Zweck werde ich Linker verwenden -l Flagge mit m was kommt von libm.so Bibliothek.

$ gcc fib.o -lm
$ nm a.out
0000000000201010 B __bss_start
0000000000201010 b completed.7697
                 w [email protected]@GLIBC_2.2.5
0000000000201000 D __data_start
0000000000201000 W data_start
0000000000000620 t deregister_tm_clones
00000000000006b0 t __do_global_dtors_aux
0000000000200da0 t 
__do_global_dtors_aux_fini_array_entry
0000000000201008 D __dso_handle
0000000000200da8 d _DYNAMIC
0000000000201010 D _edata
0000000000201018 B _end
0000000000000722 T fibo
0000000000000804 T _fini
                 U [email protected]@GLIBC_2.2.5
00000000000006f0 t frame_dummy
0000000000200d98 t __frame_dummy_init_array_entry
00000000000009a4 r __FRAME_END__
0000000000200fa8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000083c r __GNU_EH_FRAME_HDR
0000000000000588 T _init
0000000000200da0 t __init_array_end
0000000000200d98 t __init_array_start
0000000000000810 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000000800 T __libc_csu_fini
0000000000000790 T __libc_csu_init
                 U [email protected]@GLIBC_2.2.5
00000000000006fa T main
                 U [email protected]@GLIBC_2.2.5
                 U [email protected]@GLIBC_2.2.5
0000000000000660 t register_tm_clones
00000000000005f0 T _start
0000000000201010 D __TMC_END__

Sie können jetzt sehen, Funktionen pow, floor verknüpft sind GLIBC_2.2.5.

Die Reihenfolge der Parameter ist ebenfalls wichtig, es sei denn, Ihr System ist standardmäßig für die Verwendung von gemeinsam genutzten Bibliotheken konfiguriert, mein System ist dies nicht. Wenn ich also ausgebe:

$ gcc -lm fib.o
fib.o: In function `fibo':
fib.c:(.text+0x57): undefined reference to `pow'
fib.c:(.text+0x84): undefined reference to `floor'
collect2: error: ld returned 1 exit status

Notiz -lm Flag vor der Objektdatei. Also abschließend hinzufügen -lm Flag nach allen anderen Flags und Parametern, um sicher zu sein.

1423600cookie-checkUndefinierter Verweis auf `pow’ und `floor’

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

Privacy policy