Linken der Standardbibliotheken
- 
					
					
					
					
 Hallo seit wenigen Tagen beschäftige ich mit der Programmiersprache C. 
 Mein OS ist ein Debian Wheezy, mein editor vim und mein compiler cc.Ich arbeite eher mit kleinen Programmen/Übungsaufgaben. Da entstand auch meine Frage. Zum verdeutlichen meiner Frage zeige ich zwei kleine Programme. #include <stdio.h> #include <math.h> int main (void) { double a=1,b=-5,c=6,x1,x2; x1 = (-b + sqrt(b*b-4*a*c))/(2*a); x2 = (-b - sqrt(b*b-4*a*c))/(2*a); printf("x1 = %lf\nx2 = %lf\n",x1,x2 ); return 0; }cc -o sqrt -lm sqrt.c #include <stdio.h> #include <stdlib.h> int main (void) { int num,res; scanf("%i", &num ); while (num != 0) { res = random() % num + 1 ; printf("Randomnumber: %i\n", res); scanf("%d",&num); } printf("EXIT\n"); return 0; }cc -o fcttask fcttask.c Der Aufruf zum Kompilieren der sqrt.c musste mit einen "-lm" ergänzt werden, da mir sonst die Fehlermeldung /tmp/ccdfI9IJ.o: In function `main': sqrt.c:(.text+0x59): undefined reference to `sqrt' sqrt.c:(.text+0x99): undefined reference to `sqrt' collect2: ld returned 1 exit statusum die Ohren flog. Im Gegensatz dazu konnte ich die fcttask.c ohne weitere Optionen kompilieren. Bei beiden Programmen arbeitete ich mit zwei Standardbibliotheken deren Linken/Einbinden aus meiner Sicht nicht erforderlich seien sollte. Warum aber benötigt der Kompiler einmal diese Angabe und das andere mal nicht? Vielen Dank für eure Hilfe! 
 
- 
					
					
					
					
 Hallo, durch die include-Anweisungen werden ja nur die Deklarationen der Funktionen der Standardbibliotheken eingebunden, die Implementierung ist aber in den Systembibliotheken (c.lib, m.lib etc.) hinterlegt. 
 Standardmäßig linkt der Compiler (bzw. der zugehörige Linker) die c.lib automatisch mit, aber die m.lib mußt du dann noch händisch hinzufügen (da dort die mathematischen Funktionen wie sqrt, sin, cos, exp etc. untergebracht sind).P.S: ".lib" ist hier nur als Platzhalter zu verstehen (je nach verwendeten Betriebssystem und Dateisystem kann die konkrete Datei anders heißen). 
 
- 
					
					
					
					
 Zunächst einmal vielen Dank für deine Antwort. Also es besteht ein Unterschied zwischen den "Standardlibrarys"? Darf ich diese so nennen? Aber woher weiß ich jetzt welche Librarys ich explizit hinzulinken muss oder ist die math.h hier ein Einzelfall? Gibt es dazu eine Historie die diesen Umstand erklärt? 
 
- 
					
					
					
					
 flynk schrieb: Aber woher weiß ich jetzt welche Librarys ich explizit hinzulinken muss oder ist die math.h hier ein Einzelfall? Jain. Bisher ja. Seit Threads auch Teil der Standardbibliothek von C und C++ geworden sind, muss man eventuell noch die Threadingbibliothek des OS hinzulinken und eventuell sogar dem Compiler noch mitteilen, dass er multithreadingtauglichen Code erzeugen soll. Gibt es dazu eine Historie die diesen Umstand erklärt? Ja, dafür wird es sicherlich einmal gute Gründe gegeben haben. Doch wie so oft gilt: Vieles was einst war, ist verloren, da niemand mehr lebt, der sich erinnert! Alles begann mit dem Schmieden der großen Ringe…Spekulationen darüber im Internet gibt es viele, aber keine gefällt mir so wirklich. Vielleicht: 
 - Die libm ist im Vergleich zur Standardbibliothek recht groß, sie würde die Linkzeit auf einem langsamen Rechner stark erhöhen
 - Eine separate libm vereinfacht es erheblich, eine eigene Implementierung zu benutzen. Dies ist bei der Standardbibliothek nicht so wichtig, weil diese, nun, nur Standardzeugs macht, über das sich jedermann einig sein dürfte. Aber bei den Mathefunktionen kann die konkrete Implementierung sehr große Unterschiede in der Geschwindigkeit und Präzision ausmachen. Da gibt es kein richtig oder falsch, was man braucht hängt von der genauen Anwendung ab.
 
- 
					
					
					
					
 SeppJ schrieb: - Die libm ist im Vergleich zur Standardbibliothek recht groß, sie würde die Linkzeit auf einem langsamen Rechner stark erhöhen Ich denke nicht, dass das einen messbaren Unterschied macht. SeppJ schrieb: - Eine separate libm vereinfacht es erheblich, eine eigene Implementierung zu benutzen. Ja, aber das erklärt nicht, weshalb sie nicht implizit mitgelinkt wird. Wer sich die Mühe macht, sin durch was besseres zu ersetzen, darf dann halt sagen "link das ohne -lm". SeppJ schrieb: Alles begann mit dem Schmieden der großen Ringe…Mir gefällt die Erklärung besser, dass es unter manchen historischen Computernprozessoren keine Unterstützung für Floating-Points gab und deswegen eine mathlib dort keinen Sinn hätte. 
 
 
			
			
		