Referencia indefinida a ''pow'' y ''floor''
gcc undefined-reference (5)
Intento hacer una simple calculadora de Fibonacci en C, pero cuando compilo, gcc
me dice que me faltan las funciones de pow y floor. ¿Qué pasa?
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:
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
Agregue -lm a sus opciones de enlace, ya que pow () y floor () son parte de la biblioteca matemática:
gcc fib.c -o fibo -lm
En cuanto a la respuesta proporcionada por Fuzzy:
De hecho, tuve que hacer algo un poco diferente.
Proyecto -> Propiedades -> C / C ++ Build -> Configuración -> GCC C Linker -> Bibliotecas
Haga clic en el pequeño ícono de agregar verde, escriba m y pulse Aceptar. Todo en esta ventana se ha aplicado automáticamente, ya que es una biblioteca.
Encontrar el punto donde agregar -lm en Eclipse-IDE es realmente horrible, así que me tomó algo de tiempo.
Si alguien más también usa Edlipse, esta es la manera de agregar el comando:
Proyecto -> Propiedades -> C / C ++ Build -> Configuración -> GCC C Linker -> Miscelánea -> Indicadores del enlazador: en este campo agregue el comando -lm
Necesitas compilar con el flag -lm
, así:
gcc fib.c -lm -o fibo
Esto le indicará a gcc que vincule su código con la lib de matemáticas. Solo asegúrate de poner la bandera después de los objetos que deseas vincular.
Para el beneficio de cualquiera que lea esto más tarde, debe vincularlo como Fred dijo:
gcc fib.c -lm -o fibo
Una buena forma de averiguar qué biblioteca necesita vincular es revisando la página de manual, si existe. Por ejemplo, "man pow" y "man floor" te dirán:
Enlace con -lm.