Por que estou recebendo Fazer a ligação erros ao chamar função no math.h?
Pergunta
Ao tentar funções de chamada em math.h
, eu estou recebendo erros de link como o seguinte
undefined reference to sqrt
Mas eu estou fazendo um #include <math.h>
Estou usando gcc e compilar o seguinte:
gcc -Wall -D_GNU_SOURCE blah.c -o blah
Por que não o ligador encontrar a definição para sqrt
?
Solução
Adicionar -lm ao comando quando você chamar gcc:
gcc -Wall -D_GNU_SOURCE blah.c -o blá -lm
Isto irá dizer o vinculador a ligação com a biblioteca de matemática. Incluindo math.h irá dizer ao compilador que as funções matemáticas como sqrt () existem, mas são definidos em uma biblioteca separada, que as necessidades de vinculador para embalar com seu executável.
Como freeMemory apontou a biblioteca é chamado libm.a. No Unix-like sistemas, a regra para bibliotecas de nomeação é lib [blah] .a. Então se você quiser ligá-los ao seu executável você usa -l [blah].
Outras dicas
Você precisa vincular a biblioteca matemática explicitamente. Adicionar -lm
para as bandeiras que você está passando para gcc para que o vinculador sabe a ligação libm.a
Anexar -lm
ao final do comando gcc para vincular a biblioteca matemática:
gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm
Para que as coisas estar ligada corretamente, a ordem das bandeiras do compilador importa! Especificamente, o -lm
deve ser colocado no final da linha .
Se você está se perguntando por que as necessidades da biblioteca math.h
para ser incluído em tudo quando compilar em C, veja esta explicação aqui .