Próbuję zrobić prosty kalkulator Fibonacciego w C, ale podczas kompilacji gcc
mówi mi, że brakuje mi funkcji pow i floor. Co jest nie tak?
Kod:
#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));
}
Wynik:
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
źródło
źródło
n
Odpowiedzi:
Musisz skompilować się z flagą linku
-lm
, na przykład:To powie gcc, aby połączyć twój kod z biblioteką matematyczną. Po prostu pamiętaj, aby umieścić flagę po obiektach, które chcesz połączyć.
źródło
lib<name>.a
lublib<name>.so
- to „<nazwa>”, którą wstawiasz po-l
. W tym przypadku nazwa biblioteki matematycznejlibm.so
, więc ją nazywamy-lm
.Dodaj -lm do opcji linków, ponieważ pow () i floor () są częścią biblioteki matematycznej:
źródło
Z korzyścią dla każdego, kto to przeczyta później, musisz połączyć się z tym, jak powiedział Fred:
Dobrym sposobem, aby dowiedzieć się, do której biblioteki chcesz linkować, jest sprawdzenie strony podręcznika, jeśli taka istnieje. Na przykład
man pow
iman floor
obie powie ci:Połącz z
-lm
.Wyjaśnienie łączenia biblioteki matematycznej w programowaniu w C - Łączenie w C
źródło
W odniesieniu do odpowiedzi udzielonej przez Fuzzy:
Właściwie musiałem zrobić coś nieco innego.
Projekt -> Właściwości -> C / C ++ Kompilacja -> Ustawienia -> GCC C Linker -> Biblioteki
Kliknij małą zieloną ikonę dodawania, wpisz mi naciśnij OK. Wszystko w tym oknie ma automatycznie zastosowane -l, ponieważ jest to biblioteka.
źródło
Znalezienie punktu, w którym dodać -lm w Eclipse-IDE jest naprawdę okropne, więc zajęło mi to trochę czasu.
Jeśli ktoś inny również używa Edlipse, oto sposób dodania polecenia:
Projekt -> Właściwości -> Kompilacja C / C ++ -> Ustawienia -> GCC C Linker -> Różne -> Flagi konsolidatora: w tym polu dodaj polecenie -lm
źródło
Wszystkie powyższe odpowiedzi są niekompletne, problem tkwi w konsolidatorze,
ld
a nie w kompilatorzecollect2: ld returned 1 exit status
. Podczas kompilowaniafib.c
obiektu do obiektu:Gdzie
nm
wyświetla symbole z pliku obiektowego. Możesz zobaczyć, że zostało to skompilowane bez błędu, alepow
,floor
iprintf
funkcje mają niezdefiniowane odniesienia, teraz, jeśli spróbuję połączyć to z plikiem wykonywalnym:Otrzymuję podobne wyniki. Aby to rozwiązać, muszę powiedzieć linkerowi, gdzie szukać odniesień
pow
, iwfloor
tym celu użyję-l
flagi linkera, zm
którą pochodzi zlibm.so
biblioteki.Możesz teraz zobaczyć, funkcje
pow
, zfloor
którymi są połączoneGLIBC_2.2.5
.Kolejność parametrów też jest ważna, chyba że twój system jest skonfigurowany do korzystania z bibliotek współdzielonych domyślnie, mój system nie jest, więc kiedy wydaję:
Uwaga
-lm
flaga przed plikiem obiektu. Podsumowując-lm
, dla pewności dodaj flagę po wszystkich innych flagach i parametrach.źródło