Estoy tratando de hacer una calculadora de Fibonacci simple en C, pero cuando compila gcc
me dice que me faltan las funciones pow y floor. Que 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
c
gcc
undefined-reference
Gabriele Cirulli
fuente
fuente
n
Respuestas:
Necesita compilar con la bandera de enlace
-lm
, así:Esto le dirá a gcc que vincule su código con la biblioteca matemática. Solo asegúrese de colocar la bandera después de los objetos que desea vincular.
fuente
lib<name>.a
olib<name>.so
- es el "<nombre>" que coloca después de-l
. En este caso, se nombra la biblioteca matemáticalibm.so
, así que la llamamos-lm
.Agregue -lm a sus opciones de enlace, ya que pow () y floor () son parte de la biblioteca matemática:
fuente
Para el beneficio de cualquiera que lea esto más adelante, debe vincularlo como Fred dijo:
Una buena manera de averiguar qué biblioteca necesita vincular es verificando la página de manual si existe. Por ejemplo,
man pow
yman floor
ambos te dirán:Enlace con
-lm
.Una explicación para vincular la biblioteca matemática en la programación en C - Vinculación en C
fuente
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 my presione OK. Todo en esta ventana se ha aplicado automáticamente, ya que es una biblioteca.
fuente
Encontrar el punto donde agregar el -lm en Eclipse-IDE es realmente horrible, así que me llevó algo de tiempo.
Si alguien más también usa Edlipse, esta es la forma de agregar el comando:
Proyecto -> Propiedades -> C / C ++ Build -> Configuración -> GCC C Linker -> Misceláneo -> Banderas de Linker: en este campo agregue el comando -lm
fuente
Todas las respuestas anteriores están incompletas, el problema aquí radica en el vinculador en
ld
lugar del compiladorcollect2: ld returned 1 exit status
. Cuando está compilando sufib.c
objeto a:Donde
nm
enumera los símbolos del archivo objeto. Puede ver que esto se compiló sin un error, peropow
,floor
y lasprintf
funciones tienen referencias indefinidas, ahora si intento vincular esto al ejecutable:Estoy obteniendo una salida similar a la que obtienes. Para resolver eso, necesito decirle al vinculador dónde buscar referencias
pow
yfloor
, para este propósito, usaré el-l
indicador del vinculadorm
que proviene de lalibm.so
biblioteca.Ahora puede ver, las funciones
pow
,floor
están vinculados aGLIBC_2.2.5
.El orden de los parámetros también es importante, a menos que su sistema esté configurado para usar bibliotecas compartidas de manera predeterminada, mi sistema no lo es, así que cuando emito
Nota
-lm
bandera antes del archivo de objeto. En conclusión, agregue una-lm
bandera después de todas las demás banderas y parámetros, para estar seguro.fuente