Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

1

14.09.2007, 13:14

Lib in Dll

Hallo

Ich habe mal ne Frage zu dll und libs - Hab jetzt schon lange nachgedacht und gsucht
aber ich finde nichts:

Wenn ich das richtig verstanden habe, wird eine zur DLL hinzugelinkte
LIB trotzdem in der EXE gespeichert richtig ?
Das macht ja auch sinn, weil die header - Datei der Lib
ja nichts für eine Dll definiert... :cry: :cry:

Kann ich das irgendwie umgehen, so das die Lib trotzdem in der Dll
gespeichert wird ?

Danke

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

14.09.2007, 15:48

erstmal eine kurze erklärung zum thema dll vs lib:

der unterschied zwischen einer lib und einer dll ist folgender:
die lib wird statisch gelinkt, die dll dynamisch (wie die namen ja schon verraten). statisches linken bedeutet, dass die lib eben nach dem kompillieren, beim linkvorgang gelinkt werden. im prinzip kannst du dir vorstellen, dass einfach der code aus der lib, der von der exe verwendet wird, in die exe datei kopiert wird.

eine dll hingegen, wird zur laufzeit (also dynamisch) geladen. das bedeutet, dass, wenn du jetzt z.b. eine exe, die eine dll verwendet, startest, die exe dem betriebssystem sagt, dass sie die dll xyz braucht. das betriebssystem lädt die dll dann in den speicher der exe und die exe sucht sich die funktionen aus der dll die sie benötigt.

beides hat vor und nachteile. eine statische lib ist quasi in der exe datei drin, man braucht also keine extra datei in der die bibliothek enthalten ist (wie bei einer dll der fall). weiters wird auch nur jener code, der von der exe benötigt wird, in die exe gepackt. alles andere bleibt draußen. die lib hat aber den nachteil, dass sie die die exe größer macht (eben weil der code einfach in die exe übernommen wird). wenn du mehrere verschiedene exe dateien laufen hast, die alle die gleiche lib verwenden, dann hast du auch mehrmals den gleichen code im ram herumliegen. bei einer dll hingegen, wird der code nur einmal im speicher abgelegt und von allen programmen, die die dll verwenden, benutzt. da die dll in einer extra datei vorliegt und beim start des programmes geladen (und gelinkt) wird, kann man die dll einfach durch eine neue austauschen und die programme verwenden dann automaisch die neue dll, ohne dass man an den exe dateien etwas ändern muss.

http://support.microsoft.com/kb/815065


wenn jetzt eine lib zur dll gelinkt wurde, dann ist diese lib in der dll drin und die exe bekommt nichts davon mit. ich denke aber du meinst eigentlich was anderes. diese lib dateien die dazu dienen eine dll zu linken, die tun im prinzip nichts anderes als dir das "händische" laden der dll abzunehmen ;)

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

3

14.09.2007, 17:47

Ich möchte dir noch einen tipp mit auf den weg als dll-progger geben:
Viele leute hier im forum haben schon den - ich nenne es einfach mal fehler - gemacht und die dll manuell geladen(aus ganz unterschiedlichen gründen).
Tu dir sowas nicht an. Linke sie lieber ganz normal, dann hast du weniger arbeit.

Socke

4

14.09.2007, 18:00

Das ist nunja nicht wirklich eine sonders sinnliche Aussage. Wenn du eine Funktion hast, die alle Vorgänge in einer DLL anstößt, ist es durchaus sinnvoll nur diese Funktion per LoadLibrary GetProcAddress zu laden ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

5

14.09.2007, 18:10

Dann durchaus da muss ich dir recht geben. Hab daran gar nicht gedacht, ich dachte nur daran, funktion für funktion zu laden.

Socke

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

14.09.2007, 18:28

Zitat von »"Deviloper"«

Wenn du eine Funktion hast, die alle Vorgänge in einer DLL anstößt, ist es durchaus sinnvoll nur diese Funktion per LoadLibrary GetProcAddress zu laden ...


warum?

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

7

14.09.2007, 19:42

Also erst mal danke für die tipps...

ich meinte das so:

Ich bin dabei einige LIBS zu machen. Die mache ich, weil ich
net möchte, dass bei jedem noch so kleinen programm von mir
ne dll mit drin hängt.

So später - habe ich mir überlegt - will ich aber noch mal was grösseres machen ( z.B.: nen grosses Spiel ).
Zu diesem möchte ich dann eine engine in form einer Dll
bereitstellen, um immer nur das spiel zu updaten und nicht immer
jede Kleinigkeit. Deshalb möchte ich dann eine Dll erstellen,
die alle meine ( und andere :D) Libs enthält.
Diese Libs sollen dann natürlich in der Dll-datei gespeicher ( hinzugelinkt)
werden und nicht zu der EXE.

Deshalb frage ich.

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

8

16.09.2007, 18:19

Also ich habe jetzt doch noch mal ne frage dazu:

Wenn ich eine LIB mache, dann deklariere ich eine Funktion doch so:

C-/C++-Quelltext

1
2
// die Funktion

int sayHelloOnConsole()


und in einer Dll so:

C-/C++-Quelltext

1
2
// die Funktion

int DLL_API sayHelloOnConsole()


Wobei DLL_API so definiert ist:

C-/C++-Quelltext

1
2
3
4
5
#ifndef DLL_EXPORT
  #define DLL_API __declspec(dllimport) 
#else 
  #define DLL_API __declspec(dllexport) 
#endif


Wenn ich jetzt die .h - datei der LIB in eine dll einbinde,
fehlt doch DLL_API( oder andere bezeichnung). Woher soll dann später wenn die dll verwendet wird, der Compiler wissen,
dass die funktion aus der LIB jetzt in der Dll ist.
Er wird sie also mit in die EXE einbinden.

Habe ich das richtig verstanden ?
Wenn ja wie kann ich das umgehen, so das die Lib zur Dll - datei
hinzugelinkt wird ?

Danke

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

9

16.09.2007, 18:42

Folgendes:
Wenn du eine dll auf "normalem" wege erstellst(also so wie zb die tribase irrlicht ogre und was weiss ich was es so gibt) dann hast du meistens einen header den du includierst. in diesem header ist die api definiert.
Angenommen deine dll heisst jetzt mal "Test", dann würde deine api warschenlich wie folgt definiert sein:

C-/C++-Quelltext

1
2
3
4
5
#ifndef TEXT_EXPORTS
#define TEST_API __declspec(dllimport)
#else
#define TEST_API __declspec(dllexport)
#endif


TEST_EXPORTS wird dabei automatisch vom kompiler erstellt, wenn du die dll kompilierst.
So nehmen wir mal eine klasse in der dll, wo net alle methoden inline sind:

C-/C++-Quelltext

1
2
3
4
class TEST_API CTest
{
// bla bla bla

};

Wenn du alle methoden der klasse innerhalb der klasse definierst, musst du die klasse net exportieren. Wenn doch dann musst du sie exportieren, da du sonst nicht aufgelöste symbole kriegst(kommt gleich).

Also nehmen wir mal an du hast jetzt eine dll(wieder test.dll) geschrieben und kompiliert.
Eine Lib wird automatisch auch erstellt.
So das verzeichnis wo diese lib liegt kannst du nun im vs bekanntgeben.(Bei bibliotheksdateien).
Alternativ kannst du die lib auch erst noch wo anders hin kopieren als in zb den debug ordner.(Geht auch mit post-build ereignis).

Jedenfalls muss der pfad wo die lib liegt bekannt sein.
Dann erstellst du ein projekt welches die dll verwenden soll.
Einfach mal als beispiel ne ganz normale konsolenanwendung. leeres projekt.
Nun includierst du den header der dll, wo die api definiert ist.
dann.... geht ist in die projekteigenschaften->linker->eingabe oder englisch link->input.
So dort schreibst du jetzt den name deiner lib rein.
noch ein bissl code, dann kompilieren und fertig.
Ach was ich ganz vergessen habe: Das verzeichnis wo der header liegt, muss natürlich auch bekannt sein(unter includedateien).

Wie wäre es wenn wir dieses meisterwerk ins FAQ tun? dann würde es sich lohnen die rechtschreibfehler zu korrigieren.


Socke

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

10

16.09.2007, 19:01

hmmm ja das habe ich scon verstanden,
aber was ich meine ist nicht die atomatisch erstellte LIB-Datei,
sondern eine Externe, die erstmal nichts mit der dll zu tun hat.
Sie ( also die LIB) soll aber in der dll-datei enthalten sein um die funktionen die die
LIB enthält der EXE zugänglich zu machen,
ohne dass diese LIB in der EXE datei enthalten ist.

Ein kleines beispiel:

Ich habe zwei selbstgemachte LIBs.
Z.B. einen XML-Reader und eine Sammlung häufig gebrauchter Rechnungen.
so... jetzt will ich ein spiel machen.
Nun würde ich ja normalerweise dem Projekt des Spieles ( also der EXE) beide Libs dazulinken.
Das will ich aber nicht, weil sie die EXE-datei ( das Spiel )
nämlich ziemlich groß machen würden.:(

Also erstelle ich eine DLL die beide LIBS ( den XML-Reader und die Rechensammlung)
enthält.
Nun lasse ich die EXE auf die Dll zugreifen um zB eine Xml auszulesen.

So habe ich eine EXE-Datei die das Spiel enthält und eine Dll-Datei,
die die beiden Libs und so den Xml-Reader und die Rechensammlung enthält.

Aber ist das überhaupt möglich ?
Ich dachte eigentlich schon. :roll:

Werbeanzeige