2011-12-29 36 views
100

Estoy tratando de hacer una calculadora de fibonacci simple en C pero al compilar gcc me dice que me faltan las funciones de pow y floor. ¿Qué pasa?Referencia indefinida a 'pow' y 'floor'

Código:

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

Salida:

[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

Como la precisión del punto flotante no es infinita, dará respuestas incorrectas para los valores no tan grandes de 'n' – vonbrand

Respuesta

194

Se necesita compilar con la bandera -lm, así:

gcc fib.c -lm -o fibo 

Esto le dirá gcc para enlazar el código contra la matemática lib. Solo asegúrese de poner la bandera después de los objetos que desea vincular.

+6

¿Podría explicar cómo resolver la letra para poner después de -l? –

+41

Buscar en/lib o/usr/lib. Todas las bibliotecas se denominan 'lib .a' o' lib .so' - es la "" que coloca después de '-l'. En este caso, la biblioteca matemática se llama 'libm.so', por lo que la llamamos' -lm'. – ams

+3

Gracias! He estado buscando en Google durante los últimos 30 minutos y esta es la primera referencia que dice vincular las bibliotecas después de los objetos –

24

Añadir -lm a sus opciones de enlace, ya pow() y baja() son parte de la biblioteca matemática:

gcc fib.c -o fibo -lm 
6

Para encontrar el punto en el que añadir el -lm en Eclipse-IDE es realmente horrible, así que me tomó algo de tiempo.

Si otra persona también utiliza Edlipse, aquí es la forma en cómo agregar el comando:

Proyecto -> Propiedades -> C/C++ Build -> Configuración -> GCC C Linker -> DIVERSOS - Banderas> Linker: en este campo agregar el comando -lm

8

en lo que respecta a la respuesta proporcionada por Fuzzy:

que en realidad tenía que hacer algo un poco diferente.

Proyecto -> Propiedades -> C/C++ Build -> Configuración -> GCC C Linker -> Bibliotecas

Haga clic en el icono verde pequeño complemento, m Tipo y pulse OK. Todo en esta ventana se ha aplicado automáticamente, ya que es una biblioteca.

9

Para el beneficio de cualquiera que lea esto más adelante, es necesario enlazar contra ella como Fred dijo:

gcc -o fib.c -lm Fibo

Una buena manera de averiguar lo que necesita la biblioteca para enlazar es revisando la página del manual, si existe. Por ejemplo, "man pow" y "man floor" le informarán:

Enlace con -lm.

Cuestiones relacionadas