#include <math.h> Problem
-
Hey,
ich hab hier ein kleines Verständnisproblem.
Ich hab ein Programm geschrieben, das von der sqrt() aus math.h Funktion gebrauch macht. So nun hab ich eine Fehlermeldung beim Compilieren mit gcc 4.4.3 erhalten
und zwar: undefined reference to `sqrt'.Bevor ich anfing zu googln hab ich ein zweites, einfacheres Programm geschrieben, dass nur die Quadratwurzel von 6 berechnet und das Ergebnis im Terminal ausgibt.
Dieses Program lief auch -> verwirrt (den wo ist der Unterschied außer vielleicht 10-15 Zeilen mehr Code).Hab gegooglt und herausgefunden das ich mit der Option -lm die math.h Library linken muss. Gesagt, getan und läuft.
Jetzt versteh ich aber nicht warum ichs manchmal nicht linken muss bzw. der Linker das automatisch macht, und ich es manchmal manuell machen muss.
-
Wenn der Wert im Code feststeht, dann erübrigt sich die Notwendigkeit die Quadratwurzelfunktion einzubinden. Dann kann der Wert sofort beim compilieren berechnet werden. Vergleiche:
int main() { float foo; scanf("%f", &foo); printf("%f\n",sqrt(foo)); // braucht -lm }
Und
int main() { printf("%f\n",sqrt(8)); // Braucht kein -lm }
-
Ok, aber warum macht das der Linker nicht automatisch bei math.h, bei den anderen Headerdateien wie z.B. stdlib oder string.h muss ich auch keine Optionen fürs linken angeben. Was macht math.h da anders das es nötig wird die Option fürs linken anzugeben.
-
Alles andere ist die libc, die wird von C Programmen immer gelinkt, weil ohne die überhaupt nichts läuft. Die Trennung von Mathefunktionen und restlicher Standardbibliothek hat meines Wissens nach historische Gründe aus den Zeiten als es noch keine Fließkommaprozessoren gab und mathematische Berechnungen in Programmen eine riesige, langsame Softwareemulation benötigten, eben die libm. Da war es gut, auf diese auch verzichten zu können, wenn man sie nicht braucht.
Jedenfalls sind diese Gründe antik (in Computerzeitaltern gemessen) und mehr oder weniger vergessen. Vielleicht waren es auch andere und ich liege falsch. So ist es zum Beispiel vorstellbar, dass professionelle Numeriker in der damaligen Zeit die Möglichkeit wollten, gegen ihre eigenen Mathefunktionen zu linken.
-
Ist glaub ich wie Sepp schrieb bis zur 486er CPU gab es Prozessoren mit und ohne mathematischen Coprozessor. Damals mit Copro Typenbezeichnung bei 386er und 486er Intel DX, ohne SX. Manchmal konnte man den Coprozessor auch nachrüsten. Einige der späteren Stromsparprozessoren hatten da auch gespart.
Ist schon länger her. Soweit ich mich noch erinnere war es damals üblich bei umfangreicheren mathematischen Funktionen unterschiedlichen Quelltext zu erstellen, je nachdem ob auch den Zielsystemen der Mathecopro vorhanden war oder nicht.
MfG f.-th.