Verständnisfrage : lib/dll und Header



  • Guten Morgen Deutschland:)

    Ich beschäftige mich gerade bisschen mit statischen und dynamischen Libraries.. und spiele da auch grad bissel rum um die Konzepte zu verstehen. Und habe da noch ein paar Fragezeichen im Kopf:) Und ich komme eig. aus der .NET Welt, da sieht ja anders aus:)

    1.) Wenn ich eine statische Lib habe, und diese in einem anderen Projekt "verlinke" brauch eich ja trotzdem noch die Header zu den lib dazu richtig!? Wieso kann der comipler nicha uch die Header informationen mit in die lib packen!?

    2.) Wenn ich eine Dll habe brauch ich auch explizit die Header-Dateien für die Schnittstellen nach außen, da stellt ich mir noch mehr die Frage wieso in dem Fall die Header nich mit in die Dll verpackt wurde, und durch verweisen der Compiler weiß, was es da für Typen etc. gibt (wie in .NET)

    3.) Sind native Dlls eine Erfindung von MS!? die dllimport/dllexport Präfix is ja nur auf Win Plattformen notwendig, auf Linux o.ä. brauch ich das nicht mehr richtig?

    4.) Was is der unterschied zwischen "LoadLibrary/GetProcessAddress" und "dllimport/dllexport" ?

    Hoffe ich gehe euch nicht schon auf die Nerven😁



  • @SoIntMan sagte in Verständnisfrage : lib/dll und Header:

    Wieso kann der comipler nicha uch die Header informationen mit in die lib packen!?

    Mir würde eher die Frage "warum braucht man Header?" einfallen.

    C++ beruht hier (noch) auf den 50 Jahre alten Konzepten, die Dennis Ritchie dür C entworfen hat. Mit C++20 wird wahrscheinlich das Modulkonzept eingeführt. Damit entfallen Header (für daran angepasseten Code).

    C++ kennt keine Libs/DLLs. Das hängt an der Compilerimplementierung und dem Betriebssystem.



  • Der Compiler braucht die Header, um die Funktionen zu kennen. Die Implementationen der deklarierten Funktionen stecken ja in der LIB. Die braucht aber der Compiler erstmal nicht. Der muss aber wissen was deklariert ist und dafür braucht er halt die Header.



  • Ok das Header und lib getrennt sind, habe ich so verstanden damit , die lib austauschbar ist, solange sich nichts an der Signatur des Header ändert.. das habe ich so verstanden.

    Und bei Dlls braucht mal trotzdem die Header? (wie bei libs?)

    Verwenden dann andere Plattformen außer Windows keine Dlls?

    In C++20 wird es dann so sein wie in .NET nehm ich an.. Deklaration + Definition in einem!?



  • @SoIntMan sagte in Verständnisfrage : lib/dll und Header:

    Und bei Dlls braucht mal trotzdem die Header? (wie bei libs?)

    Man kann mit einer DLL kein Programm linken. Auch wenn man DLLs verwenden will, muss man mit einer dazugehörigen lib linken.

    @SoIntMan sagte in Verständnisfrage : lib/dll und Header:

    Verwenden dann andere Plattformen außer Windows keine Dlls?

    Die haben ein eigenes Format.

    @SoIntMan sagte in Verständnisfrage : lib/dll und Header:

    In C++20 wird es dann so sein wie in .NET nehm ich an.. Deklaration + Definition in einem!?

    Vermutlich


  • |  Mod

    1.) Wenn ich eine statische Lib habe, und diese in einem anderen Projekt "verlinke" brauch eich ja trotzdem noch die Header zu den lib dazu richtig!? Wieso kann der comipler nicha uch die Header informationen mit in die lib packen!?

    Weil die LIB nur der Linker bekommt. Der Compiler aber die Header-Datei.
    Technisch wäre das über eine Art #import sicherlich möglich, wie das ja auch für COM passiert.

    3.) Sind native Dlls eine Erfindung von MS!? die dllimport/dllexport Präfix is ja nur auf Win Plattformen notwendig, auf Linux o.ä. brauch ich das nicht mehr richtig?

    Das sind die Konzepte nur anders-

    4.) Was is der unterschied zwischen "LoadLibrary/GetProcessAddress" und "dllimport/dllexport" ?

    dllimport/dllexport nutzt man für implizites Laden der DLLs. D.h. die DLLs werden beim Start des Programmes automatisch geladen-
    LoadLibrary/GetProcAddress wird benutzt um expliziz eine bestimme DLL und bestimme Routinen zu binden.

    Siehe https://msdn.microsoft.com/en-us/library/253b8k2c.aspx?f=255&MSPPError=-2147217396



  • @SoIntMan sagte in Verständnisfrage : lib/dll und Header:

    Ok das Header und lib getrennt sind, habe ich so verstanden damit , die lib austauschbar ist, solange sich nichts an der Signatur des Header ändert.. das habe ich so verstanden.

    Und bei Dlls braucht mal trotzdem die Header? (wie bei libs?)

    Verwenden dann andere Plattformen außer Windows keine Dlls?

    Doch. Im Linux-Umfeld heißen die nur anders.
    https://stackoverflow.com/questions/9688200/difference-between-shared-objects-so-static-libraries-a-and-dlls-so



  • Mahlzeit;:) Super wieder mal sehr hilfreich eure Antworten.

    d.h. wenn ich eine "C++ Klassenbibilothek" als Dll erstelle, kommt eine lib mit. Und ich muss dann im gleichen Prinzip die lib dem Linker vorhanden. Aber dann habe ich das Prinzip von Dlls nicht verstanden, wenn man dann trotzdem Libs braucht? Oder sind diese dann nur Abgespeckt?



  • @SoIntMan sagte in Verständnisfrage : lib/dll und Header:

    Prinzip von Dlls nicht verstanden, wenn man dann trotzdem Libs braucht? Oder sind diese dann nur Abgespeckt?

    Du brauchst die DLL zur Laufzeit, die Lib beim Linken. In der Lib steht, wo und in welcher DLL zur Laufzeit der ausführbare Code gefunden werden kann.



  • @manni66 sagte in Verständnisfrage : lib/dll und Header:

    @SoIntMan sagte in Verständnisfrage : lib/dll und Header:

    Prinzip von Dlls nicht verstanden, wenn man dann trotzdem Libs braucht? Oder sind diese dann nur Abgespeckt?

    Du brauchst die DLL zur Laufzeit, die Lib beim Linken. In der Lib steht, wo und in welcher DLL zur Laufzeit der ausführbare Code gefunden werden kann.

    Wie schon angedeutet ist das nur unter windows notwendig. Unter linux z.b. gibt es keine .lib Dateien. Da wird direkt die .so (.dll equivalent) oder .a (.lib, wenn statische library) dem linker übergeben.



  • Ok , bei Dlls habe ich demnach eine lib für den linker und H für den compiler!

    Ich habe mich bissel eingelesen, wenn LoadLibrary verwende, brauche ich keine lib, da ich da nur FuncPtr /Methoden binde oder? Außer ich muss Typen bekannt machen!?

    Ohje.. wenn ich Euch auf den Geist gehe,sagt es😆 😅


  • |  Mod

    @SoIntMan sagte in Verständnisfrage : lib/dll und Header:

    Ok , bei Dlls habe ich demnach eine lib für den linker und H für den compiler!

    Ich habe mich bissel eingelesen, wenn LoadLibrary verwende, brauche ich keine lib, da ich da nur FuncPtr /Methoden binde oder? Außer ich muss Typen bekannt machen!?

    Nö. Auch dann brauchst Du das nicht.

    Nehmen wir an, Du hast eine einzige Methode, in Deiner DLL, die Du aufrufst. Diese liefert nur einen Zeiger. Dieser Zeiger ist ein Interface... und schon kannst Du komplexeste Dinge bauen.
    Also man baue eine Factory Funktion und die liefert brav Interfaces zu Objekten.

    Das ist COM auf "billig"... 😉



  • Guten Morgen 🙂

    Ich habe bissel am WE gelesen , und bin da auf simple Pll Plugin Konzepte gestoßen. Da werden ja auch zur Laufzeit Dlls geladen , sie müssen nur eine bestimmte API (Interface) Klasse implementieren (@Martin-Richter das meintest du damit gell)!? Und dieser Mechanismus funktioniert ja bei LoadLibrary... so wie ich verstanden habe.

    Aber @manni66 schrieb :"Man kann mit einer DLL kein Programm linken. Auch wenn man DLLs verwenden will, muss man mit einer dazugehörigen lib linken."

    Das raff ich nicht, wann brauche ich eine lib zur Dll und wann nicht.. bei nem "Plugin System brauch ich wohl keine" ... Ich warte noch auf den "AHAAA -Effekt")😁


  • |  Mod

    Die Lib benötigst Du immer für das Implizite Linken. Sonst nicht.
    Mit der Lib teilst Du dem Linker mit, welche DLL für welche Funktion zum Programm geladen werden muss... das geschieht dann implizit beim Laden.

    Lib <=> Implizites Linken...

    Wenn Du also ein Interface hast, benötigst Du dessen Layout und das steckt im Header file.
    Allerdings musst DU natürlich die Signatur der Funktionen in Deiner DLL kennen.



  • @SoIntMan sagte in Verständnisfrage : lib/dll und Header:

    Das raff ich nicht, wann brauche ich eine lib zur Dll und wann nicht.. bei nem "Plugin System brauch ich wohl keine" ... Ich warte noch auf den "AHAAA -Effekt")

    Wenn du den Linker verwenden willst um "automatisch" gegen die DLL zu linken - so wie es auch bei statischen Libs funktioniert - dann brauchst du die "import LIB" für die DLL. Weil der Linker die halt braucht.

    Wenn du LoadLibrary verwendest um die DLL "manuell" zu laden, dann brauchst du keine "import LIB". Weil der Linker hier gar nichts von der DLL weiss, und daher auch keine "import LIB" braucht.



  • Jetzt hat es KLICK gemacht,:) DANKE