Bibliotheken

mueslirocker

Mitglied
Hallo,

dieser Thread soll absolute Grundlagen behandeln und das tut mir irgendwie leid, da man diese ja normalerweise selbst finden können sollte. Entsprechend allgemein ist auch das Topic. Am liebsten würde ich ihn gar nicht öffnen.
Ich habe versucht, im Netz Wissen über Grundlagen zu Bibliotheken in C(++) zu finden. Ich finde viele einzelne Beispiele, wie man dies baut, wie man das importiert. Hilft mir aber nicht, um einen Überblick zu gewinnen.


Mein Hauptproblem: lib's gegen dll's

Als ich mich das erste mal schlau machte, meine ich herausgefunden zu haben, dass man immer entweder libs oder dlls braucht. Entweder man linkt die lib ein (dachte, das wäre eine Sammlung von kompilierten Objekten) und braucht dann keine dll mehr oder man linked nichts ein und benutzt dann beim Ausführen die dll.

Nun lese ich, dass die libs alleine gar nichts bringen und dass man bei statisch geklinkten dlls die libs braucht.

Ich habe auch schon eine dll ohne eine lib gebaut und diese erfolgreich benutzt (mit gcc/g++, Cygwin). Ich schätze mal, dass ich dabei nur eine Namenskonvention gebrochen habe und eigentlich doch eine lib hatte.. oder ich habe das System immernoch nicht richtig verstanden.

Mir fehlt also Verständnis über den grundlegenden Aufbau von Bibliotheken.
Ich habe das Gefühl, als gäbe es dabei auch noch Unterschiede zwischen den einzelnen Compilern.
Ich nutze cygwin, mingw und Visual Stduio 2003.. allerdings dort kein C# oder sowas.. nur C++ ohne MFC (wann immer es geht).

Unter Linux sieht das ganze wie unter cygwin aus, nur dass es nicht lib sondern a und nicht dll sondern so heißt? Oder ist es da nochmal anders?


Neben der Datei-(Typ-)Hierachie habe ich auch Probleme mit dem Quellcode.
Manchmal braucht man WINAPI aka __declspec(dllex/import), manchmal nicht.
Es gibt noch die die Attribute __stdcall und far, die mir manchmal geholfen haben.
Manchmal reicht ein def-File, das ich... woraus generieren kann?

Ich schätze mal, dass man bei den meisten Fragen auch noch zwischen C und C++ unterscheiden muss. Falls es hilft, mir geht es in erster Linie um C-Code. C++ wäre interessant, aber wenn es zu aufwendig ist, bin ich auch nur mit C zufrieden.

Wo ich schon bei Einschränkungen bin. Falls es hilft, lasst bei euren Erklärungen dynmaisch geladene Bibliotheken weg.

Ich habe noch gelesen, dass einige Compiler/kompilierte Progamme auf eine Binär-Signatur der Bibliothek achten, so dass man die DLLs nicht im nachhinein austauschen kann. Ist das wahr? "Wer" macht sowas? Ist das nur bei statisch gelinkten Bibliotheken so?

Die möglichen Nutzungen von dlltool ist mir auch nicht ganz klar.
Erstelle ich damit eine lib passend zu meiner dll? Woher kommt das def-File? Oder brauch ich keins?
Was kann das Programm noch?


Um das ganze noch an einem konkreten Beispiel aufzuhängen:

Ich habe eine Bibliothek bekommen. In Delphi geschrieben.
Ich bekam, ein def-File, ein C-Header-File (benutzt __declspec, wenn ich nicht irre), eine dll und eine lib.
Wenn ich mit g++ versuche, die lib mit der Option -l einzubinden, sagt mir der Compiler, dass das Dateiformat nicht gültig ist. Ich nehme an, dass die lib gar nicht für C-Code (bzw den Compiler/Linker g++) gedacht war. Es waren auch noch andere Interfaces (für VB und Delphi/Pascal selbst, wenn ich das richtig sehe) dabei.
Ich habe versucht mit dlltool aus der dll und dem def File eine neue lib zu bauen. Die liest er richtig ein, hat aber beim Linken unbekannte Referenzen.. nämlich die Funktionen, die ich aus der Bibliothek benutzen möchte.
In der lib finde ich die Funktionsnamen in Klartext, allerdings hängt ein "__imp" davor, während das nicht gefundene Symbol das Präfix "_" hat.
Ist das also nur ein Problem mit der Namenskonvention? Kann ich dlltool dazu bringen, das "__imp" wegzulassen und stattdessen ein "_" zu setzen (für letzteres gibt es sogar eine Option). Oder kann ich den Compiler dazu bringen, die Funktionen unter "__imp" zu suchen?
Gehe ich das Problem überhaupt korrekt mit dlltool an?


Ich freue mich über jede neue Erkenntnis. Besonders was das Verständnis über die einzelnen Dateien von Bibliotheken angeht.
Auch mit hilfreichen LInks bin ich natürlich einverstanden.
 
Zurück