Frage zur Dll Einbindung + Genrelle DLL Frage.
-
Hallo Community,
ich hab mir heute ein kleines Testprogramm auf OpenCV Basis mit Eclipse CDT auf Windows geschrieben. MingGW als Compiler
Jetzt habe ich eine kleine Frage.
Die nötigen Libraries für OpenCv stehen als .dll und .dll.a zur Verfügung.
Um ein Programm mit OpenCV Funktionalität zu erstellen muss ich also den Ordner mit .dll Datein in den Project Settings bei MingGW C++ Link als Library Path hinterlegen.Kompiliert auch wunderbar. Allerdings kann ich das Programm erst (auch mit Eclipse) ausführen wenn ich die dll Datei im selben Ordner der kompilierten Binärdatei hinterlege oder eben durch Path Variable zur Verfügung stelle.
Jetzt zu meiner Frage:[cpp]
Wie kann ich Eclipse sagen wo die DLL Datei für das Ausführen der Binärdatei liegen. Dachte eigentlich das würde sich durch den C++ Linker erledigen. Aber offenbar ist da der Bezug nur beim Kompilieren da.Und zweite Frage:
Was sind eigentlich dll.a Datein und für was sind diese gut?vg
Mimax
-
Mimax schrieb:
Allerdings kann ich das Programm erst (auch mit Eclipse) ausführen wenn ich die dll Datei im selben Ordner der kompilierten Binärdatei hinterlege oder eben durch Path Variable zur Verfügung stelle.
Du hast den Sinn und Zweck von DLLs und den Unterschied zu statischen Libs nicht verstanden.
Was sind eigentlich dll.a Datein und für was sind diese gut?
.a sind statische Libs, .dll sind dynamisch (nachzuladene) Libs, s.o.
Sei froh, dass dein Codelieferant statische Libs liefert, du sparst dir mit solcherlei gelinkten EXEs irgendwelche Laufzeit-Unverträglichkeiten.
-
kurz erklärt:
eine dll ist praktisch (einfach ausgedrückt) ein ausführbares programm, es fehlen einfach nur die exe header. man kann auch eine exe als dll laden, und dann unter umständen die dort definierten externen functionen nutzen. in der dll sind eben nur funktionen definiert, dadurch muss man nicht immer den gesammten quellcode in einer exe haben sondern kann funktionen auslagern und schnell in neue exe wiederverwenden, spart natürlich zeit.
-
buntehaare schrieb:
eine dll ist praktisch (einfach ausgedrückt) ein ausführbares programm, es fehlen einfach nur die exe header.
Das stimmt so aber nicht! Zwar ist eine DLL ein "Programm" das in den Speicherbereich des Lade-Prozesses gemappt wird(zumindest der Code), aber sie hat genauso den MZ-Header, den PE-Header("PE\0\0", IMAGE_FILE_HEADER, IMAGE_OPTIONAL_HEADER) usw.! Die Unterscheidung findet anhand des 14. Bits des Characteristics-Words im IMAGE_FILE_HEADERs statt: 0=Programm, 1=DLL
Um es mal einfach zu sagen: Bei Statischen Libs werden während des linkens die benötigten Funktionen in die EXE kopiert, bei DLLs werden nur die Verweise in den .idata-Abschnitt geschrieben beim Laden durch den EXE-Loader geladen(oder ohne .idata während der Ausführung durch LoadLibrary und GetProcAddress). Der Vorteile bestehen darin das die EXE kleiner wird und die DLL für mehrere Prozesse nur einmal geladen werden muss.
Außerdem kann man Programme durch DLLs auch in Module zerlegen (was zum Beispiel beim Updaten Vorteile bietet).