You are not logged in.

  • Login

1

Friday, September 28th 2007, 9:05pm

Library in Visual Studio 2005 erstellen

Ich soll eine Bibliothek erstellen, in der ich alle Funktionen sammle, die ich so in laufe der Zeit immer wieder brauche. (Schulaufgabe)
Die header Datei habe ich schon in das richtige Verzeichniss kopiert (...\VC\include).

Wie aber erstelle ich eine *.lib, sodass ich nur die header include und die bestimmte Funktion benutzen kann, ohne sie ins Projektverzeichnis aufnehmen zu müssen?
Oder verstehe ich da etwas grundlegend falsch?

Gruß
Martin

2

Saturday, September 29th 2007, 4:15pm

Wikipedia bietet hier einige Infos Dynamic Link Library

Hier mal eine schnelle Zusammenfassung mit Beispielen.

Zuerst die DLL und LIB erstellen. Beim kompilieren des folgenden Beispiels, werden mit VC die erfoderlichen Dateien erstellt:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#if defined(_MSC_VER)
#include <windows.h>
#define DLL extern "C" __declspec(dllexport)
#else
#define DLL
#endif
// nur unter MS VC das Symbol DLL definieren; z.B. unter Linux wird DLL ignoriert
 
// Die Funktion, die anderen Programmen zur Verfügung gestellt werden soll
// (in diesem Beispiel: Addieren zweier Zahlen)
 
DLL double AddNumbers (double a, double b) {
 
return a + b;
 
}


Schließlich kann man die DLL auf zwei Arten einbinden.
1) Man bindet die DLL beim Programmstart ein, oder
2) man bindet die DLL während der Laufzeit des Programms ein.

1) Funktion bei Programmstart einbinden mit __declspec(dllimport):

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
#include <windows.h>
#include <stdio.h>
 
// Importieren der Funktion aus der oben erstellten DLL
extern "C" __declspec(dllimport)double AddNumbers (double a, double b);
 
int main () {
// Aufrufen der externen Funktion
double result = AddNumbers(1, 2);
printf("Das Ergebnis ist: %f\n", result);
return 0;
}


2) Man bindet die DLL während der Laufzeit ein und nutzt die Funktionen LoadLibrary, GetProcAddress und schließlich FreeLibrary:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <windows.h>
#include <stdio.h>
 
// Definition der DLL-Funktion, die verwendet werden soll
typedef double (*AddNumbers)(double, double);
 
int main () {
AddNumbers function;
double result;
 
// DLL Datei laden
HINSTANCE hinstLib = LoadLibrary("MyDll.dll");
 
if (hinstLib) {
// Die Einsprungadresse abfragen
function = (AddNumbers) GetProcAddress(hinstLib, "AddNumbers");
 
// Die Funktion aufrufen
if (function)
result = (*function) (1,2);
 
// Die DLL-Datei wieder entladen
BOOL fFreeResult = FreeLibrary(hinstLib);
} 
 
// Das Ergebnis anzeigen
if (!hinstLib || !function)
printf("Fehler: Konnte die Funktion nicht aufrufen\n");
else
printf("Das Ergebnis ist: %f\n", result);
return 0; 
}



Die DLL muss sich im Verzeichnis des Programms befinden.
Sobald die angeforderte DLL nicht vorhanden ist, wird dein OS eine Fehlermeldung ausgeben und das Programm beenden. Der Vorteil biem Einbinden während der Laufzeit ist, dass der Programmierer ggf. Ausnahmen abfangen kann um derartige Programmabstürze zu unterbinden.

This post has been edited 2 times, last edit by "Blue" (Sep 29th 2007, 4:22pm)


3

Saturday, September 29th 2007, 11:24pm

Danke für die ausführliche Antwort und den Link.
Ich hätte nun eine Variante mit weniger "Schreibarbeit" erwartet.

In der Verion 6 des VIsual Studio funktioniert das wohl so, dass man
- die header Datei in das Verzeichnis "...\Microsoft Visual Studio}VC98\include" kopiert
- Ein neues Projekt anlegt: WIn32 Static Library
- Quellcode Datei(en) mit den Funktionsdefinitionen einfügt
- Projekt erstellt - somit die *.lib erstellt

- Die .lib Datei muss man dann nur noch in aus dem Projektverzecihnis in das Verzeichnis"...\...\VC98\lib" kopieren und dem Linker bescheid geben.

So einen Weg muss es doch auch in Visual Studio 8 geben.

Deine Antworten werde ich mir selbstverständlich trotzdem mal zu Gemüte ziehen.

Gruß
Martin

4

Tuesday, June 30th 2009, 11:53pm

Hallo,

ist ja schon 2 Jahre her ... und ist eher kommenter zum 3. Post (Samstag, 29. September 2007, 23:24), aber falls jemand das braucht:

kurz: (leider in deutschem VS2005) Datei->Neu->ProjectAusForhandenemCode...-> felder ausfullen, ->weiter->(in drop-menu) LIB
sollte weiter ähnlich zu 6.0 sein

hier kann man weiter nachschauen: http://msdn.microsoft.com/de-de/library/y32h25f5(VS.80).aspx

MfG Andreas

Similar threads

Social bookmarks