Frage zu Bibliotheken

07/25/2011 00:21 cooler7878#1
So ich hätte da eine kleine (vielleicht auch dumme) Frage.

Wenn ich bei einem Projekt (sagen wie mal was mit Sockets)
eine statische Bibliothek(ws2_32.lib) lade warum muss ich dann noch die Headerdatei winsock einbinden ich meine theoretisch sind doch alle funktionen schon in der statischen Bibliothek deffiniert ?!
Ich freue mich auf Antworten
07/25/2011 02:04 link#2
Es handelt sich dabei um zwei verschiedene Ebenen:
Compiler -> Linker

Der Compiler hat nichts mit libs zu tun und weiß daher nicht, was z.B. send oder recv ist, wenn es vorher nicht z.B. in einer Headerdatei deklariert wurde.
Dazu kommen halt noch Konstanten und Makros, die auch in Headerdateien gepackt werden.
Außerdem würde ein Funktionsname in einer lib-Datei nur ein Label sein und der Compiler wüsste dann nicht, welche Parameter die Funktion erwartet.
Erst der Linker erkennt die Referenz zu send und fügt den Code aus der lib und für den Aufruf die entsprechende Adresse ein (bzw. erstellt einen Import Table-Eintrag und verweist darauf)

Edit:
Kann auch sein, dass ich mich dick irre, bin ja müde und so *hust*
Also lieber noch auf die nächste Antwort warten :P
07/25/2011 12:56 MrSm!th#3
Außerdem musst du auch bedenken, dass Funktionen nur da bekannt sind und sein sollen, wo sie deklariert sind.
Das machst du durch Header.

Du kannst es gleichsetzen mit Header Dateien und Code Dateien.

Wenn du eine .cpp Datei mit ein paar Funktionsdefinitionen hast, kannst du die noch lange nicht in anderen Dateien nutzen.
Du musst sie erst in einem Header deklarieren und den in die anderen Dateien einbinden.

So ist es auch mit den Libraries. Es ginge zwar theoretisch, dass du alleine mit der .lib die Funktionen einbinden kannst (@link: afaik werden Parameter usw. auch in der Library notiert), aber das widerspräche ja auch dem Prinzip der Datenkapselung (ok Daten- passt jetzt hier schlecht, da es nicht um Daten geht, aber es ist im Grunde dasselbe)! Es soll nicht alles überall bekannt sein, sondern nur dort, wo du es (in diesem Fall mit einem Header) bekannt machst.
Außerdem, auch wenn die nötigen Informationen theoretisch in der Library enthalten sind, ist der Compiler etwas anderes als der Linker, wie link schon sagte. Zur Compile-Zeit weiß der Compiler noch nix von den Informationen; da müsstest du schon Compiler und Linker verbinden, damit das geht (so ist es doch glaube ich auch in .NET, da sind ja auch Dlls gleichzeitig Header und Library).

Du kannst ja auch nicht send und recv in anderen .cpp Dateien nutzen, in denen du winsock.h nicht einbindest ;O
07/25/2011 13:33 cooler7878#4
Ich danke euch
07/25/2011 15:02 link#5
Quote:
Wenn du eine .cpp Datei mit ein paar Funktionsdefinitionen hast, kannst du die noch lange nicht in anderen Dateien nutzen.
Das ist halt das gleiche Prinzip:
Jede .cpp-Datei wird zu einer .obj-Datei kompiliert und eine .lib-Datei ist nichts anderes als eine Zusammenfassung mehrerer .obj-Dateien.
Die eine .cpp-Datei benötigt Funktionsdeklarationen der anderen, da sie praktisch nichts miteinander zu tun haben und erst der Linker wieder mit den Referenzen untereinander arbeitet.

Quote:
@link: afaik werden Parameter usw. auch in der Library notiert
Das Name Mangling gibt z.B. an, wie viele Parameter erwartet werden und welche Calling Convention benutzt wird.
Das dient aber soweit ich weiß nur dazu, die Funktionen auseinander zu halten wegen Namespaces und Überladungen (kann mich auch irren, wüsste aber gerade nicht, was der Linker sonst z.B. mit der Calling Convention anfangen sollte)
07/25/2011 16:22 MrSm!th#6
Jo, C++ Funktionen werden mit Parametern etc. notiert, damit für Überladungen die richtige gewählt werden kann.