Estou tentando fazer uma calculadora de fibonacci simples em C, mas quando a compilação gcc
me diz que estou perdendo as funções pow e floor. O que há de errado?
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));
}
Resultado:
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
fonte
fonte
n
Respostas:
Você precisa compilar com o sinalizador de link
-lm
, desta forma:Isso instruirá o gcc a vincular seu código à biblioteca matemática. Apenas certifique-se de colocar a bandeira após os objetos que você deseja vincular.
fonte
lib<name>.a
oulib<name>.so
- é o "<name>" que você coloca após o-l
. Nesse caso, a biblioteca de matemática é nomeadalibm.so
, como chamamos-lm
.Adicione -lm às suas opções de link, pois pow () e floor () fazem parte da biblioteca de matemática:
fonte
Para o benefício de quem ler isso mais tarde, é necessário vincular-se a ele, como Fred disse:
Uma boa maneira de descobrir qual biblioteca você precisa vincular é verificando a página de manual, se houver alguma. Por exemplo,
man pow
eman floor
ambos lhe dirão:Vincular com
-lm
.Uma explicação para vincular a biblioteca matemática na programação C - Vinculando em C
fonte
Em relação à resposta fornecida por Fuzzy:
Na verdade, eu tive que fazer algo um pouco diferente.
Projeto -> Propriedades -> Compilação C / C ++ -> Configurações -> GCC C Linker -> Bibliotecas
Clique no pequeno ícone verde de adição, digite me pressione ok. Tudo nesta janela foi automaticamente aplicado a -l, pois é uma biblioteca.
fonte
Encontrar o ponto em que adicionar o -lm no Eclipse-IDE é realmente horrível, por isso levei algum tempo.
Se alguém também usar o Edlipse, veja como adicionar o comando:
Projeto -> Propriedades -> Compilação C / C ++ -> Configurações -> Vinculador do GCC C -> Diversos -> Sinalizadores do vinculador: neste campo, adicione o comando -lm
fonte
Todas as respostas acima estão incompletas, o problema aqui está no vinculador,
ld
e não no compiladorcollect2: ld returned 1 exit status
. Quando você está compilando seufib.c
objeto:Onde
nm
lista símbolos do arquivo de objeto. Você pode ver que esta foi compilado sem um erro, maspow
,floor
eprintf
funções têm referências indefinidas, agora se eu vou tentar ligar este ao executável:Estou obtendo resultados semelhantes. Para resolver isso, preciso informar ao vinculador onde procurar referências
pow
efloor
, para esse fim, utilizarei o-l
sinalizador de vinculador com om
qual vem dalibm.so
biblioteca.Agora você pode ver, as funções
pow
,floor
estão ligados aGLIBC_2.2.5
.A ordem dos parâmetros também é importante, a menos que seu sistema esteja configurado para usar bibliotecas compartilhadas por padrão, meu sistema não é, portanto, quando emito:
Observe o
-lm
sinalizador antes do arquivo do objeto. Portanto, em conclusão, adicione-lm
sinalizador após todos os outros sinalizadores e parâmetros, para ter certeza.fonte