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
.