Warum brauchen Sie eine explizite "-lm" Compiler-Option [duplizieren]

Mögliche Duplikate:
gcc: warum wird das Flag -lm benötigt, um die mathematische Bibliothek zu verknüpfen?

Im Allgemeinen, um eine der mathematischen Funktionen außer der Header-Datei zu verwendenmath.h Sie müssen mit der Linker-Option -lm verknüpfen.-l Hier würde die Linker-Option zum Durchsuchen der spezifischen Bibliothek bedeutenlibm.o.

Meine Frage ist

Warum enthält GCC diese Bibliothek nicht standardmäßig? Liegt es daran, dass die Bibliothek in hohem Maße einen mathematischen Coprozessor verwendet und das zusätzliche Codebit hinzugefügt werden muss, um die Gleitkommainitialisierung zu initialisieren (möglicherweise verwende ich hier die falsche Terminologie)?

Hinweis

Ich habe gerade alle im Link genannten Antworten durchgesehenhttp://stackoverflow.com. Das macht für mich nicht viel Sinn. Es gibt drei Hauptgründe

Die Standardbibliotheken sind garantiert verfügbar. Das Verlinken anderer posix-Bibliotheken wie pthread ist explizit sinnvoll, aber warum müssen wir für eine Standardbibliothek einen expliziten Link erstellen? Auch der historische Grund ist nicht sehr klar.Warum wurde libm von libc getrennt?Warum erben wir diese Verhaltensweisen in den jüngsten GCC-Compilern immer noch? Welche Einfachheit erreicht es? Hier ist, was ich getestet habe, ohne libm und mit libm. The One without libm, ich habe meine eigene Version von Pow geschrieben

Hier ist das Beispiel

<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>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage