2011-12-29 12 views
100

Sto provando a creare una semplice calcolatrice di fibonacci in C ma durante la compilazione di gcc mi viene detto che mi mancano le funzioni di pow e floor. Cosa c'è che non va?Riferimento indefinito a `pow 'e` floor'

Codice:

#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)); 
} 

uscita:

[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 
+0

Poiché la precisione in virgola mobile non è infinita, questo darà risposte errate per valori non troppo elevati di 'n' – vonbrand

risposta

194

È necessario compilare con la bandiera -lm, in questo modo:

gcc fib.c -lm -o fibo 

Questo dirà gcc per collegare il tuo codice contro la matematica lib. Assicurati di mettere la bandiera dopo gli oggetti che vuoi collegare.

+6

Potresti spiegare come elaborare la lettera da inserire dopo -l? –

+41

Cerca in/lib o/usr/lib. Le librerie sono tutte chiamate 'lib .a' o' lib .so' - è il "" che hai inserito dopo '-l'. In questo caso, la libreria matematica è chiamata 'libm.so', quindi la chiamiamo' -lm'. – ams

+3

Grazie! Sono stato googling negli ultimi 30 minuti e questo è il primo riferimento che dice di collegare le librerie dopo gli oggetti –

24

Aggiungi -lm alle opzioni di collegamento, dal momento che pow() e pavimento() fanno parte della libreria matematica:

gcc fib.c -o fibo -lm 
6

Per trovare il punto in cui aggiungere il -lm in Eclipse IDE è davvero orribile, quindi mi ci è voluto un po 'di tempo.

Se qualcun altro usa anche Edlipse, qui è il modo come aggiungere il comando:

Progetto -> Proprietà -> C/C++ Build -> Impostazioni -> GCC C Linker -> DIVERSE - Bandiere> Linker: in questo campo aggiungere il comando -lm

8

per quanto riguarda la risposta fornita da Fuzzy:

ho dovuto fare qualcosa di leggermente diverso.

Progetto -> Proprietà -> C/C++ Build -> Impostazioni -> GCC C Linker -> Biblioteche

Fare clic sull'icona Aggiungi verde poco, m Tipo e premere OK. Tutto in questa finestra ha automaticamente l'applicazione -l ad esso poiché è una libreria.

9

Per il bene di qualcuno leggendo questo in seguito, è necessario collegare contro di essa come Fred ha detto:

gcc fib.c -lm -o Fibo

Un buon modo per scoprire che cosa avete bisogno biblioteca per collegare è controllando la pagina man, se ne esiste una. Ad esempio, "man pow" e "man floor" ti diranno entrambi:

Collegamento con -lm.

Problemi correlati