Ich versuche, einen einfachen Fibonacci-Rechner in C zu erstellen gcc
, aber beim Kompilieren erfahre ich, dass mir die Pow- und Floor-Funktionen fehlen. Was ist los mit dir?
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:
gab@testvm:~/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
c
gcc
undefined-reference
Gabriele Cirulli
quelle
quelle
n
Antworten:
Sie müssen mit dem Link-Flag
-lm
wie folgt kompilieren :Dadurch wird gcc angewiesen, Ihren Code mit der Math-Bibliothek zu verknüpfen. Stellen Sie einfach sicher, dass die Flagge hinter den Objekten steht, die Sie verknüpfen möchten.
quelle
lib<name>.a
oderlib<name>.so
- es ist der "<Name>", den Sie nach dem eingeben-l
. In diesem Fall heißt die Mathematikbibliotheklibm.so
, also nennen wir sie-lm
.Fügen Sie -lm zu Ihren Linkoptionen hinzu, da pow () und floor () Teil der Mathematikbibliothek sind:
quelle
Damit jemand dies später lesen kann, müssen Sie einen Link dazu erstellen, wie Fred sagte:
Eine gute Möglichkeit, um herauszufinden, welche Bibliothek Sie verknüpfen müssen, besteht darin, die Manpage zu überprüfen, falls eine vorhanden ist. Zum Beispiel
man pow
und werdenman floor
Ihnen beide sagen:Link mit
-lm
.Eine Erklärung zum Verknüpfen der Mathematikbibliothek in der C-Programmierung - Verknüpfen in C.
quelle
In Bezug auf die Antwort von Fuzzy:
Ich musste tatsächlich etwas anderes machen.
Projekt -> Eigenschaften -> C / C ++ Build -> Einstellungen -> GCC C Linker -> Bibliotheken
Klicken Sie auf das kleine grüne Symbol zum Hinzufügen, 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.
quelle
Es ist wirklich schrecklich, den Punkt zu finden, an dem das -lm in Eclipse-IDE hinzugefügt werden kann, daher habe ich einige Zeit gebraucht.
Wenn jemand anderes auch Edlipse verwendet, können Sie den Befehl folgendermaßen hinzufügen:
Projekt -> Eigenschaften -> C / C ++ Build -> Einstellungen -> GCC C Linker -> Verschiedenes -> Linker-Flags: Fügen Sie in dieses Feld den Befehl -lm ein
quelle
Alle obigen Antworten sind unvollständig, das Problem liegt hier
ld
eher im Linker als im Compilercollect2: ld returned 1 exit status
. Wenn Sie Ihrfib.c
to-Objekt kompilieren :Wobei
nm
Symbole aus der Objektdatei aufgelistet werden. Sie können sehen, dass dies ohne Fehler kompiliert wurde, aberpow
,floor
undprintf
Funktionen haben undefinierte Referenzen, wenn ich jetzt versuchen werde, dies mit der ausführbaren Datei zu verknüpfen:Ich bekomme eine ähnliche Ausgabe, die du bekommst. Um das zu lösen, muss ich dem Linker mitteilen, wo nach Verweisen gesucht werden soll
pow
, undfloor
zu diesem Zweck werde ich das Linker--l
Flag verwenden, mitm
dem aus derlibm.so
Bibliothek stammt .Sie können nun sehen, Funktionen
pow
,floor
sind verknüpftGLIBC_2.2.5
.Die Reihenfolge der Parameter ist ebenfalls wichtig, es sei denn, Ihr System ist standardmäßig für die Verwendung gemeinsam genutzter Bibliotheken konfiguriert. Mein System ist dies jedoch nicht. Wenn ich also Folgendes ausführe:
-lm
Flag vor Objektdatei beachten . Fügen Sie abschließend-lm
nach allen anderen Flags und Parametern ein Flag hinzu , um sicherzugehen.quelle