336 Stimmen

Warum müssen Sie die Mathematik-Bibliothek in C verknüpfen?

Wenn ich oder in einem C-Programm einfüge, muss ich diese beim Kompilieren nicht verknüpfen, aber ich muss verknüpfen, beispielsweise mit -lm mit GCC:

gcc test.c -o test -lm

Was ist der Grund dafür? Warum muss ich die Mathematikbibliothek explizit verknüpfen, aber nicht die anderen Bibliotheken?

0 Stimmen

3voto

Steve Summit Punkte 37650

Es ist ein Fehler. Du solltest nicht mehr ausdrücklich -lm angeben müssen. Vielleicht wird es behoben, wenn sich genügend Leute darüber beschweren. (Ich glaube das nicht ernsthaft, da die Verwalter, die den Unterschied aufrechterhalten, offensichtlich sehr stur sind, aber ich kann hoffen.)

0 Stimmen

Ein Bug von GCC?

0 Stimmen

2voto

stdio ist Teil der Standard-C-Bibliothek, die standardmäßig von GCC verlinkt wird.

Die mathematischen Funktionsimplementierungen befinden sich in einer separaten libm-Datei, die standardmäßig nicht verlinkt wird, daher müssen Sie sie mit -lm angeben. Übrigens besteht kein Zusammenhang zwischen diesen Headerdateien und Bibliotheksdateien.

4 Stimmen

Er weiß, dass..er fragt warum

0 Stimmen

Er fragt warum. Simon erklärt, dass einige Bibliotheken standardmäßig verlinkt sind, wie stdio, während die Mathematik-Bibliothek standardmäßig nicht verlinkt ist und daher explizit angegeben werden muss.

6 Stimmen

Ich würde sagen, dass die Frage darauf abzielt zu ergründen, warum libm standardmäßig nicht verbunden ist (oder sogar separat von libc) , da ihr Inhalt weitgehend Teil der C-Standardbibliothek ist.

2voto

Saptarshi das Punkte 189

Alle Bibliotheken wie stdio.h und stdlib.h haben ihre Implementierung in libc.so oder libc.a und werden standardmäßig vom Linker verknüpft. Die Bibliotheken für libc.so werden automatisch beim Kompilieren verknüpft und sind in der ausführbaren Datei enthalten.

Aber math.h hat seine Implementierungen in libm.so oder libm.a, die separat von libc.so sind. Es wird nicht standardmäßig verknüpft und Sie müssen es manuell beim Kompilieren Ihres Programms in GCC verknüpfen, indem Sie das -lm Flag verwenden.

Das GNU GCC-Team hat es so konzipiert, dass es sich von den anderen Header-Dateien unterscheidet, während die anderen Header-Dateien standardmäßig verknüpft werden, jedoch nicht die math.h-Datei.

Hier lesen Sie den Abschnitt 14.3, Sie können alles lesen, wenn Sie möchten: Grund warum math.h verknüpft werden muss

Schauen Sie sich diesen Artikel an: Warum müssen wir math.h in GCC verknüpfen?

Schauen Sie sich die Verwendung an:

Verwendung der Bibliothek

0 Stimmen

Das wurde bereits hier in anderen Antworten gesagt. Und das beantwortet nicht einmal die Frage. Die Frage ist, warum libm standardmäßig nicht verlinkt ist.

0 Stimmen

Es bedeutet, dass math.h eine separate Bibliotheksdatei ist, die separat in libm.so geschrieben ist, während für die anderen Headerdateien sie in libc.so sind, während andere Headerdateien automatisch verknüpft sind, aber math.h muss manuell verknüpft werden, indem der -lm-Flag hinzugefügt wird.

0 Stimmen

Alle sind Teil der Standardbibliothek. Die Frage ist, warum nicht alle standardmäßig verknüpft sind. "Weil das so ist, wie das gcc-Team es entworfen hat", ist eine schlechte Antwort. Die Frage war, was der Grund dafür ist. Und hier gibt es großartige Antworten, die detailliert auf die historischen Gründe eingehen. Deine Bearbeitung macht deine Antwort besser, aber ich sehe immer noch nicht, welchen Wert sie gegenüber all den anderen Antworten hier hinzufügt.

2voto

jdhao Punkte 17638

Beachten Sie, dass -lm möglicherweise nicht immer angegeben werden muss, auch wenn Sie einige C-Mathematikfunktionen verwenden.

Zum Beispiel das folgende einfache Programm:

#include 
#include 

int main() {

    printf("output: %f\n", sqrt(2.0));
    return 0;
}

kann erfolgreich mit folgendem Befehl kompiliert und ausgeführt werden:

gcc test.c -o test

Es wurde auf GCC 7.5.0 (auf Ubuntu 16.04) und GCC 4.8.0 (auf CentOS 7) getestet.

Der Beitrag hier gibt einige Erklärungen ab:

Die von Ihnen aufgerufenen mathematischen Funktionen werden als Compiler-Builtin-Funktionen implementiert

Siehe auch:

0 Stimmen

Dies sollte die beste Antwort sein

0 Stimmen

Aber GCC 12.2 in Manjaro erfordert immer noch das Verknüpfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X