Ich lese ein Buch mit dem Titel "Eine Einführung in GCC" und möchte eine Klarstellung. Das Buch zeigt an, dass der folgende Code einen Fehler verursachen aber wenn ich kompilieren, es baut und betreibt perfekt:gcc Linking mit statischen Bibliotheken
#include <math.h>
#include <stdio.h>
int main (void) {
double x = sqrt (2.0);
printf ("The square root of 2.0 is %f\n", x);
return 0;
}
ich aus dem Buch zitieren "Der Versuch, eine ausführbare Datei aus dieser Quelle allein zu erstellen bewirkt, dass der Compiler einen Fehler bei der Verbindung der Bühne geben: "
$ gcc -Wall calc.c -o calc
/tmp/ccbR6Ojm.o: In function `main':
/tmp/ccbR6Ojm.o(.text+0x19): undefined reference
to `sqrt'
die Lösung, die das Buch gibt, ist, dass Sie sollen den Pfad zu der Mathematik-Bibliothek 'libm.a‘wie folgt:
$ gcc -Wall calc.c /usr/lib/libm.a -o calc
wäre es sehr unbequem sein, um die Pfade zu integrierten Bibliotheken angeben zu müssen, die wir in unseren Programmen verwenden. Ich kann den Grund für das Hinzufügen des Pfades zu meinen eigenen benutzerdefinierten Bibliotheken verstehen, aber libm.a ist in gcc integriert. Und obwohl das Buch ziemlich alt ist (veröffentlicht im Jahr 2004), Was hat sich mit moderneren Versionen von gcc geändert, so dass wir den Pfad zu libm.a nicht brauchen?
* UPDATE *
Ich bemerkte, dass die von taskinoor gegebene Antwort Code aktualisiert zeigt, dass es erforderlich, dass ich die -Im Flag verwenden, wenn der Wert() sqrt nicht bestanden zum Zeitpunkt der Kompilierung bekannt ist.
Ich habe C/C++ mit VS gelernt, aber mein Ziel ist jetzt, gcc zu lernen und zu verwenden. Ich habe Visual Studio 2013 und der VS-Compiler/Linker scheint nicht so wählerisch. Zum Beispiel kann ich fast jedes einfache Programm kompilieren, ohne mysteriöse Compiler-Flags angeben zu müssen.
Ich lerne auf gcc Version 5.4, die mit KUbuntu kommt 16.04.1
Versuchen Sie zuerst ein anderes Buch, da seit Jahrzehnten die Standardmethode zum Verknüpfen einer Math-Bibliothek die Verwendung von -lm anstelle eines vollständigen Pfads zur Bibliothek ist. Zweitens enthält https://gcc.gnu.org/releases.html die Release-Änderungen. –
@JohnGriffin: Aus demselben Buch: * "Um zu vermeiden, dass lange Pfade in der Befehlszeile angegeben werden müssen, bietet der Compiler eine Abkürzungsoption '-l' für die Verknüpfung mit Bibliotheken. Beispiel: ' $ gcc -Wall calc.c -lm -o calc "entspricht dem ursprünglichen Befehl ..." * –
Beachten Sie, dass heutzutage standardmäßig dynamische Bibliotheken und keine statischen Bibliotheken verwendet werden. Vielleicht wollten Sie fragen, ob Sie mit * Standard * -Bibliotheken verlinkt haben? – Barmar