Moin,
Korrekt. Der eigentliche Programmcode bleibt aber in der DLL, deshalb ist diese nachher für die Programmausführung notwendig. Denn der Linker erzeugt nur einen "stub" für jede Funktion in der DLL, quasi eine Art Referenz. Er kann nicht den tatsächlichen Programmcode aus der DLL nehmen und in das erzeugte Programm einbauen.
Das ist nicht richtig.
'tschuldigung, ich sprach ganz unbewusst von Windows-Executables bzw. vom DLL-Prinzip unter Windows. Unter der Voraussetzung ist das Gesagte durchaus richtig.
Auch wenn die Bibliothek als .dll vorliegt, braucht der Linker natürlich eine .lib, in der die Stubs für den Laufzeitlinker (der zur Laufzeit des Programmes dynamisch die .DLLs anbindet) enthalten sind. Dies ist der Fall der dynamischen Bindung.
Ja, richtig. Das ist noch kein Widerspruch zu dem, was ich gesagt habe. Die Stubs, die er in der Importbibliothek findet, baut er dann in das Executable ein.
Statische Bindung der Bibliothek bedeutet jedoch etwas anderes:
Der Hersteller der Bibliothek erzeugt einen .lib-File, in dem keine Stubs stehen, [...] und bindet dann den Modul komplett in das ausführbare Programm ein.
Auch völlig richtig. Ist aber auch kein Widerspruch zu meiner Darstellung. Ich ging vom typischen Fall unter Windows aus, dass man eine Bibliothek als fertig übersetzte DLL hat, und zum Linken nur eine Importbibliothek dazu.
Der Vorteil dieser Methode gegenüber der einfachen Übernahme [...]
Ist mir alles bekannt, danke. Jedoch sind mir in meiner nun bald zehnjährigen Erfahrung mit Win16/Win32-Programmierung nur immer die beiden von mir geschilderten Fälle begegnet:
a) Codebibliothek als DLL mit Importbibliothek als .lib (nur Stubs)
b) Bibliothek komplett im Quelltext
Im Fall a) habe ich als Programmierer keine Wahl - ich *muss* dynamische Bindung verwenden. Ich kann nur noch wählen, ob ich die DLL schon beim Start meines Programms durch Windows laden lasse, oder ob ich das selbst mit LoadLibrary(), GetProcAddress() usw. mache.
Bei b) habe ich alle Freiheiten, wie ich die Bibliothek in mein Projekt einbinde. Ich kann sie getrennt übersetzen und eine .lib draus machen, ich kann eine DLL erzeugen und dann nach Fall a) verfahren, oder ich kann sie im Quellcode direkt in mein eigenes Programm einbinden.
Sind damit unsere unterschiedlichen Ansichten geklärt? Oder stimmt deiner Ansicht nach immer noch irgendwas nicht? ;-)
Schönen Sonntag noch,
Martin
Schildkröten können mehr über den Weg berichten als Hasen.