Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Kleine FAQ zum Thema Bibliotheken

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 17.07.2010, 22:28    Titel: Kleine FAQ zum Thema Bibliotheken Antworten mit Zitat

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!?
  1. DLL besorgen gehen
  2. 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?

  1. Das hier runterladen.
  2. dlltool, ar, as, ld und impdef müssen entweder im PATH liegen oder im Arbeitsverzeichnis
  3. Unsere DLL heißt foobar.dll, deswegen nennen wir die Importbibliothek libfoobar.dll.a
  4. 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)
  5. Der letzte Parameter gibt den exakten Namen der zu erzeugenden Importbibliothek an
  6. Bei Problemen, kann man es einfach mal mit dem Parameter -k beim dlltool versuchen.
  7. Code:
    impdef foobar.dll > foobar.def
    dlltool -D foobar.dll -d foobar.def -l libfoobar.dll.a

  8. Die Datei foobar.def kann nun gelöscht werden.
  9. 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, 19:48, insgesamt 9-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 18.07.2010, 09:26    Titel: Antworten mit Zitat

Kleiner Tipp: Nenn das ganze am besten "Kleine FAQ zum Thema PE-Bibliotheken". zwinkern

Mit PE meine ich in diesem Falle Portable Executable(sollte klar sein).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 18.07.2010, 12:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 18.07.2010, 13:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 18.07.2010, 14:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 18.07.2010, 14:17    Titel: Antworten mit Zitat

Erledigt, das Forum scheint aber irgendwie nen Problem mit Code in ner Liste zu haben...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 18.07.2010, 15:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 18.07.2010, 19:48    Titel: Antworten mit Zitat

Größtenteils erledigt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 04.02.2011, 22:29    Titel: Antworten mit Zitat

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:
Code:
ar x libMeineLib.a
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
Benutzer-Profile anzeigen Private Nachricht senden
Lou Ziffer



Anmeldungsdatum: 12.01.2012
Beiträge: 7

BeitragVerfasst am: 07.03.2012, 19:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 08.03.2012, 00:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 08.03.2012, 15:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 08.03.2012, 19:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Bibliotheken Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz