lib und dll



  • hey leute,

    leider habe ich immer noch nicht genau verstanden wo jetzt der unterschied zwischen einer lib und einer dll sein soll. leider hilft google da auch kaum weiter. kann mir das evtl einer von euch mal verdeutlichen?

    vielen dank 🙂

    gruß



  • Libs und DLLs erfüllen erstmal den selben Zweck: sie beinhalten wieder verwendbaren (kompilierten) Code. D.h. ein Programm kann sagen: ich will Lib/DLL benutzen (linken), die es schon gibt. Aber genau dann gibt es einen Unterschied: die Lib wird statisch gelinkt, d.h. sie wird in die EXE gehängt und somit gleich beim Start der EXE mit dabei. Bei der DLL wird dynamisch gelinkt. D.h. die DLL wird erst dann gelinkt, wenn eine Funktion aus der DLL benötigt wird.

    DLLs haben den Vorteil, das sie von mehreren EXEs benutzt werden können, und die DLL nur einmal im Speicher liegt. Die Lib wird aber statisch gelinkt, also ist sie so oft im Speicher, wie EXEs geladen wurden... logisch, die Lib ist ja mit in der EXE drin.



  • ahso 🙂 das war ja schonmal eine super erklärung.

    hab ich das jetzt richtig verstanden, dass die lib während die exe noch erstellt wird in mit dem eigentlich programm zusammengelinkt wird? also dass die lib in der exe steckt, sobal diese fertiggestellt ist?
    oder war damit gemeint, dass die lib kurz bevor die fertige exe ausgeführt wird in den speicher geladen wird und wenn eine weitere (andere) exe diese lib benötigt die lib nochmal redundant in den speicher geladen wird?

    und noch eine kleinigkeit.. falls ich funktionen aus einer lib/dll in meinem programm verwenden will, muss ich dann passende header-files zu der lib/dll in meinen quelltext includieren damit der kompiler nicht schimpft?

    gruß



  • Moment.

    LIB enthält keine Code wenn es nicht eine Statische Bibliothek ist.
    Die Lib enthält die Definitionen der Funktionen in einer DLL. Man linkt also die Lib dazu. Beim Programmstart wird dann die DLL geladen wo sich der eigentliche Code befindet.
    Eine LIB wird bei Programmstart garnicht geladen. Weder so noch so.
    Ist es eine Statische dann werden die Funktionen in die Exe compiliert.
    Da wird die LIB nicht gebraucht.

    Ist es eine Dynamische dann wird die LIB auch nicht geladen und nicht mehr gebraucht. Die DLL wird in den Speicher geladen.
    Greifen nun 2 verschiedenen Programme auf die gleiche DLL zu dann wird sie auch nur einmal geladen solange die DLL aus dem gleichen Verzeichnis geladen wird.
    Lädt man aber nun aber die gleiche DLL aus verschiedenen Verzeichnissen (WIndows sucht zuerst im Programmordner) dann wir die DLL auch 2 Mal in den Speicher geladen.
    Aus diesem Grund befinden sich auch die WindowsDLL in System32.



  • ok dann hatte ich das vorher falsch verstanden.

    also zusammenfassend kann man kurz sagen, dass eine eine lib in 2 kontexten auftritt.
    der erste ist, dass sie implementierte funktionen erhählt und somit als statische bibliothek dient, die ihren code während des linkens in eine exe baut.

    der zweite kontext ist, dass sie ähnlich wie ein header funktionsdeklartionen enthält und den linker beim binden darauf verweist, in welcher dll zur laufzeit die funktionsdefinitionen zu finden sind.

    hab ich das so richtig verstanden? 🙂

    falls ja, dann greift man sozusagen nur über libs auf dlls zu.
    warum wird dann davon gesprochen eine dll in sein programm einzubinden und nicht eine lib?

    vielen dank für die hilfen

    gruß



  • Artchi schrieb:

    Die Lib wird aber statisch gelinkt, also ist sie so oft im Speicher, wie EXEs geladen wurden... logisch, die Lib ist ja mit in der EXE drin.

    schlaue betriebssysteme laden .exen nicht mehrfach, also wenn du z.b. 10 instanzen desselben programms offen hast, befindet sich der code trotzdem nur einmal im speicher.
    🙂



  • ich glaube es waren auch 10 unterschiedliche exe datein gemeint, die auf die selbe lib zugreifen oder?



  • MatheStein schrieb:

    falls ja, dann greift man sozusagen nur über libs auf dlls zu.

    Nöh, Du kannst eine DLL zur Runtime auch befragen, ob sie eine bestimmte Ressource kennt.
    Kann eine Funktion, ein Icon, ein Weißdergeierwas sein.

    Eine Lib kannste nur statisch zur Compiletime binden, die Header müssen dazu vorliegen, sonst weiß Dein Linker nicht Bescheid, wie die externen Funktionen anzusprechen sind.
    Man kann auch eine DLL "quasi- statisch" zur Laufzeit über Header binden, aber das ist irgendwie "humble".



  • Ein grosser Vorteil von dll's und deren dynamischen Ladung ist die Möglichkeit von Plugin Systemen. Sprich, dass du etwas bereitstellst, was dir das Programm erweitert, ohne, dass die Programmierer des Programmes das alles kennen, respektive beachten müssen. Es gibt eine allgemeine Schnittstelle, für die man dann Plugins schreibt. Schönstes und wahrscheinlich bekannteste Beispiel ist dafür Firefox. Da gibt es ein Haufen kleinr Tools, die man sozusagen an den eigentlichen Browser anknüpfen kann und das wäre ohne dynamisches Laden wahrscheinlich eine echte Qual das vernüfntig zu implementieren.



  • MatheStein schrieb:

    ich glaube es waren auch 10 unterschiedliche exe datein gemeint, die auf die selbe lib zugreifen oder?

    Richtig!


Log in to reply