Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 17.07.2010, 23:28 Titel: Kleine FAQ zum Thema Bibliotheken |
|
|
Was sind .a und .dll.a Dateien? (Was sind (Import-)Bibliotheken?)
Eine .a Datei ist nur ein mit dem Programm ar komprimierter Dateibaum. Da wir uns hier mit Bibliotheken beschäftigen besteht dieser Dateibaum meistens nur aus einem Haufen Objektdateien, die den Code der Bibliothek enthalten, und einer weiteren Datei die keine Erweiterung hat und in einem gemischten Binär/Textformat die Namen aller in der Bibliothek definierten Funktionen enthält.
Für den Programmierer ist dieses Wissen jedoch faktisch unerheblich. Wichtig ist lediglich das Wissen, dass eine .dll.a meistens keinen eigenen Code enthält, sondern dem Programm eine DLL beigelegt werden muss, während .a s (Deepenleerzeichen zum besseren Verständnis) üblicherweise eigenen Code enthalten und keine DLL benötigen.
Eine Bibliothek, die nur eine DLL referenziert, schimpft sich Importbibliothek.
Beim Programmstart bekomme ich eine Fehlermeldung, dass eine Funktion nicht gefunden wurde!?
Die verwendete DLL-Version enthält die Funktion nicht, das heißt, dass sie meistens zu alt ist.
Unter Umständen ist die Importbibliothek (s.o.) beschädigt oder fehlerhaft. Dann muss man seine eigene Importbibliothek erstellen (mehr dazu weiter unten) oder sich vom Entwickler eine neue besorgen.
Ich habe hier nur 'ne .lib, kann ich die auch irgendwie benutzen?
Ja, einfach in .a oder .dll.a umbennenen, wie's beliebt...
Beim Programmstart bekomme ich eine Fehlermeldung, dass eine DLL nicht gefunden wurde!?
- DLL besorgen gehen
- Wenn man genau weiß, dass man die richtige DLL hat, kann man sie auch umbennenen.
dlltool? ar? as? ld? Ich nix sprecken komisch Sprach!
- dlltool: Tool, um diverse Dinge bezgl. Importbibliotheken, Definitionsdateien und DLLs anzustellen
- ar: Archiver, altes Programm aus den 80er/90er-Jahren um mehrere Dateien zu komprimieren
- as: GNU Assembler
- ld: Linker, haut die ganze Pampe von Objektdateien und Bibliotheken zu einem ausführbaren Gebilde zusammen.
Diese Programme sind allesamt Bestandteile der GNU Binutils, die sogut wie jeder freie Compiler benutzt.
Wie erstelle ich eine Importbibliothek, wenn ich nur die DLL habe?
- Das hier runterladen.
- dlltool, ar, as, ld und impdef müssen entweder im PATH liegen oder im Arbeitsverzeichnis
- Unsere DLL heißt foobar.dll, deswegen nennen wir die Importbibliothek libfoobar.dll.a
- Der erste Parameter gibt an, welche Bibliothek zur Laufzeit geladen werden muss. Unter Umständen (nicht getestet) funktionieren hier sogar Pfadangaben (bspw. system/foobar.dll)
- Der letzte Parameter gibt den exakten Namen der zu erzeugenden Importbibliothek an
- Bei Problemen, kann man es einfach mal mit dem Parameter -k beim dlltool versuchen.
Code: | impdef foobar.dll > foobar.def
dlltool -D foobar.dll -d foobar.def -l libfoobar.dll.a |
Die Datei foobar.def kann nun gelöscht werden.
Fertig. Die entstandene Importbibliothek entweder nach /lib/win32/ oder in einen bei der Kompilierung per -p angegebenen Ordner kopieren
Ich habe nur eine DLL ohne Dokumentation und möchte diese benutzen!
Mit den o.g. Methoden erzeugt man eine .def Datei in der alle Funktionen einer DLL aufgelistet sind (als normaler Text). Man kann zwar von den Funktionsnamen auf dessen Funktion schließen, aber man weiß ja nicht, wieviele und was für welche Parameter die Funktion erwartet.
Bei der Aufrufmethode StdCall kann man zwar ohne weiteres herausfinden, wieviele Bytes an die Funktion übergeben werden müssen (Zahl nach dem at-Symbol), weiß aber immer noch nicht, welcher Art diese sind.
Den 8-Byte Parameter können sowohl heißen, dass dort ein Pointer und ein Integer übergeben werden, aber auch, dass dort einfach nur eine 64-Bit-Zahl übergeben wird.
Man könnte zwar die DLL disassemblieren, aber diejenigen, die dieser Technik mächtig sind, brauchen diese FAQ nicht.
Mehr kommt noch... (falls erwünscht)
Zuletzt bearbeitet von 28398 am 18.07.2010, 20:48, insgesamt 9-mal bearbeitet |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 18.07.2010, 10:26 Titel: |
|
|
Kleiner Tipp: Nenn das ganze am besten "Kleine FAQ zum Thema PE-Bibliotheken".
Mit PE meine ich in diesem Falle Portable Executable(sollte klar sein). |
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 18.07.2010, 13:16 Titel: |
|
|
Ideen von mir dazu:
- wie erstellt man eine lib (dll.a) wenn man "nur" die DLL hat
- wie kommt man an die Funktionsnamen und Parameter der DLL wenn man keine Erläuterungen dazu hat.
Sowas hab ich mal gebraucht und es mir zusammengesucht. Aber es würde gut zum Thema passen und Du kannst es sicher besser beschreiben. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 18.07.2010, 14:27 Titel: |
|
|
Ersteres erledigt... zweiteres... was meinst du damit genau?
Die Funktionsnamen stehen ja in der Definitionsdatei. Bei den Parametern hat man bei Cdecl höchstens den Assembler (wieoft wird gepopt?) und bei stdcall eigentlich auch keine großen Anhaltspunkte. Bei stdcall weiß man zwar, wieviele Bytes übergegeben werden, aber das lässt meistens auch nicht gerade viele Rückschlüsse zu... |
|
Nach oben |
|
|
E-P-S
Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 18.07.2010, 15:10 Titel: |
|
|
Genau das wär die Frage gewesen. Was kann man machen um die Art und Anzahl der Parameter herausfinden, bzw. warum genau ist es schwierig bis unmöglich. Hatte mich etwas unglücklich ausgedrückt. _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 18.07.2010, 15:17 Titel: |
|
|
Erledigt, das Forum scheint aber irgendwie nen Problem mit Code in ner Liste zu haben... |
|
Nach oben |
|
|
The_Muh aka Mark Aroni
Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 18.07.2010, 16:21 Titel: |
|
|
Inhaltlich super. Aber bitte benutze doch eine Anständige Formulierung und nicht so viele Abkürzungen (u.U., s.o. ...) und versuche nicht jede Info in Klammern einzuschieben. Der Text ist doch recht Holprig zu lesen, da ist es besser mal 3 oder 4 Sätze mehr zu schreiben. Auch solltest du nochmal drüber gucken und unnötige Anglizismen und Fremdworte entfernen, immerhin ist der Text ja für Neulinge.
Bis auf die rhetorischen Einwände ist alles super. Danke für die Arbeit.
Oh und: vielleicht einen Lustigen Schlusssatz mit Smiley am ende statt mitten im FAQ die Smileys? Auch die stören den Lesefluss (imho) _________________ // nicht mehr aktiv // |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 18.07.2010, 20:48 Titel: |
|
|
Größtenteils erledigt. |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 04.02.2011, 23:29 Titel: |
|
|
Aus einem anderen Forum von mir:
Zitat: | In diesem Tutorial erkläre ich euch, wie man aus statischen Bibliotheken (*.a) DLLs/SOs macht und dabei auch am Modulnamen rumfummeln kann.
Eigentlich ist das ganze sehr simpel, man braucht nur den GCC, ar und strip (optional). Unter Windows bekommt man so eine Umgebung am einfachsten mit Cygwin und dem von mir empfohlenen TDM-GCC ( http://tdm-gcc.tdragon.net/ , auch als 64-bit Variante. Auf der Seite gibts auch einen Haufen Libs für 64-Bit vorkompiliert...)
Schritt 1: Die Bibliothek besorgen. Findet man in /lib/ oder /mingw<irgendwas>/lib. Die Datei hat die Endung ".a".
Schritt 2: Die Bibliothek in einen vorzugsweise leeren Ordner kopieren.
Schritt 3: Damit wird die Bibliothek entpackt. ENTPACKT? Ja richtig, Bibliotheken sind unter GCC und VC mir dem Tool ar zusammengepackte Objektdateien. Bibliotheken von VC (.lib) und GCC (.a) sind unter Windows binärkompatibel. (Ausser bei C++, aber das sollte ja klar sein.
Schritt 4: Bibliothek neu zusammensetzen. Code: | g++ -Wl,--out-implib=libGewünschterName.dll.a,--output=NameDerDll.dll *.o --shared |
--out-implib setzt den Namen der Importbibliothek, sie wird zum Linken benötgit.
--output setzt den Namen des Agriprodukts äh Binary.
*.o, klar bindet alle Objektdateien im aktuellen Ordner ein (deswegen vorzugsweise leer)
--shared sorgt dafür dass es dann auch ne DLL wird.
Schritt 5: DLL verkleinern Code: | strip --strip-all NameDerDll.dll |
Entfernt alles unnötige von der DLL.
Das sollte übrigens so auch unter Linux gehen. Funktioniert nat. auch für 64-bit Umgebungen...
Ich habe mir diese Methode ausgedacht, weil ich auf cleane DLL-Namen stehe. libboost_thread-mt.dll sieht scheiße aus, außerdem finde ich es im Explorer nicht unter B sondern L. Mit dieser Methode wird daraus ruckzuck Boost.Thread.dll. Bei einem Projekt habe ich z.B. das Hauptprogramm, dass SDL braucht (64-bit), und einen Launcher der auf Systemvorraussetzungen checkt, im selben Ordner liegt, aber 32-bittig ist (damits ne schönere Fehlermeldung gibt). -> SDL.dll + SDL64.dll |
|
|
Nach oben |
|
|
Lou Ziffer
Anmeldungsdatum: 12.01.2012 Beiträge: 7
|
Verfasst am: 07.03.2012, 20:36 Titel: |
|
|
Müssen dll's eigentlich zwingend im gleichen Verzeichnis liegen wie die ausführbare Datei(exe)? Ich fände es schöner/übersichtlicher die in einem Unterverzeichnis zu haben. |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 08.03.2012, 01:18 Titel: |
|
|
wenn mans richtig macht nicht. kA allerdings wie das geht _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 08.03.2012, 16:40 Titel: |
|
|
Im unterverzeichniss nur dann, wenn man deren Pfad expliziet beim laden angibt.
ansonsten können sie im system32 liegen, oder aber im app-verzeichniss.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 08.03.2012, 20:20 Titel: |
|
|
Man kann mit etwas Pfusch DLLs auch statisch so linken, dass sie aus einem Unterverzeichnis geladen werden. Dafür muss man die Importbibliothek aber auseinanderbauen und neu zusammenstecken (sozusagen). |
|
Nach oben |
|
|
|