Use math.h e vincule arquivos de objetos sem -lm

1

Atualmente estou lendo Programação Avançada em Linux e na seção 2.3.3  Diz-se que se eu usar alguma função de math.h eu tenho que vincular os arquivos de objeto com -lm. Mas tenho certeza de que já usei algumas funções matemáticas como sqrt, pow ou log sem precisar especificar o uso dessa biblioteca compartilhada.

Você vê onde está o problema?

Obrigado

    
por BenjaminB 27.03.2011 / 16:25

1 resposta

6

Você sempre deve usar -lm ao usar funções de math.h se quiser manter seu código / makefiles portável.

Algumas das coisas nesse cabeçalho são macros (que obviamente não precisam de bibliotecas adicionais), mas que não são especificadas (exceto algumas). Algumas outras funções podem ser implementadas como build-ins pelo seu compilador (mesmo substituídas por opcodes específicos do processador), inlined, etc ... então a vinculação correta do seu código também pode depender das configurações do otimizador e do compilador / versão exata que você está usando.

Por exemplo:

#include <stdio.h>
#include <math.h>

int main()
{
    double d = 0.2;
    fprintf(stdout, "%f\n", sqrt(d));
    return 0;
}

Com o GCC 4.5.1 no Linux:

$ gcc -o t t.c
/tmp/cczCfJsj.o: In function 'main':
t.c:(.text+0x30): undefined reference to 'sqrt'
collect2: ld returned 1 exit status

$ gcc -O3 -o t t.c
# ok, compiled and linked fine

Para poupar um pouco de dor de cabeça, basta adicionar -lm .

    
por 27.03.2011 / 16:36

Tags