Por que você precisa de uma opção explícita de compilador `-lm` [duplicado]
Duplicata Possível:
gcc: por que o sinalizador -lm é necessário para vincular a biblioteca de matemática?
De um modo geral, a fim de usar qualquer uma das funções matemáticas além de incluir o arquivo de cabeçalhomath.h
você tem que ligar com o linker opção -lm.-l
aqui significaria a opção de vinculador para pesquisar da biblioteca específicalibm.o
.
Minha pergunta é
Por que o GCC não inclui essa biblioteca por padrão? É porque a biblioteca usa muito o co-processador matemático e é necessário adicionar o bit extra de código para inicializar a inicialização de ponto flutuante (posso usar a terminologia errada aqui)?
Nota
Acabei de rever todas as respostas mencionadas no linkhttp://stackoverflow.com. Isso não faz muito sentido para mim. Existem três razões básicas atribuídas
As bibliotecas padrão têm a garantia de estar disponíveis. Vincular outras bibliotecas posix como pthread explicitamente faz sentido, mas por que temos que fazer um link explícito para uma biblioteca padrão. Mesmo a razão histórica não é muito clara.Por que a libm foi separada da libc?Por que ainda estamos herdando esses comportamentos nos compiladores recentes do gcc? Que simplicidade ela consegue? Aqui está o que testei, sem libm e com libm. The One without libm, eu escrevi minha própria versão de PowAqui está o exemplo
<code>abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ ls -1 Test_*|xargs -I{} sh -c "echo {} && echo "-----------------" && cat {}" Test_withlibm.c ----------------- #include<stdio.h> #include<math.h> int main() { int i=20; double output1=pow(2.618033988749895,i); return 0; } Test_withoutlibm.c ----------------- #include<stdio.h> #include<math.h> double Pow(double _X, int _Y) { double _Z = 1; for (; _Y; _X *= _X) { if (_Y & 1) _Z *= _X; _Y >>= 1; } return _Z; } int main() { int i=20; double output1=Pow(2.618033988749895,i); return 0; } abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ gcc Test_withlibm.c -lm -o Main_withlibm.o abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ gcc Test_withoutlibm.c -o Main_withoutlibm.o abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ objdump -d Main_withoutlibm.o|wc -l 261 abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ objdump -d Main_withlibm.o|wc -l 241 </code>