Erstellen eines lib files mit C++ Klassen

Hallo C++ Programmierer,

ich arbeite mit MS Visual C++ V6 unter NT und möchte von mir erstellte Klassen in eine lib bzw. dll exportieren.
Kann mir jemand sagen wie ich das mache?
Ich würde das gerne machen, ohne meinen code besonders verändern zu müssen wenn’s geht.
Darüber hinaus habe ich gehört, dass es nicht möglich ist, statische Variablen zu verwenden. Kann man das umgehen?

Gruß und schon mal danke
Karsten

Leg’ Dir einfach mit VC++ mal ein DLL-Projekt an (Win32 Dynamic-Link Library) und lass’ Dir ein paar Beispiel-Exports generieren (unterster Radio-Button, „A DLL that exports some symbols“). Dann hast Du Beispiele, an die Du Dich halten kannst. Das schaffst Du dann.

Das wichtigste ist eigentlich, dass Du vor Symbolen, die Du exportieren willst, ein Makro schreiben musst. VC++ definiert das in der Beispiel-Datei automatisch fuer Dich, es sieht aber in etwa so aus (Namen sind natuerlich evtl. anders):

#ifdef TESTDLL\_EXPORTS
#define TESTDLL\_API \_\_declspec(dllexport)
#else
#define TESTDLL\_API \_\_declspec(dllimport)
#endif

Jetzt musst Du vor jedes zu expoertierende Symbol TESTDLL_API schreiben:

// This class is exported from the testdll.dll
class TESTDLL\_API CTestdll
{
 public: CTestdll(void); // TODO: add your methods here.
};

Was auch noch wichtig ist: Speicher kann nur von der DLL freigegeben werden, in der er reserviert wurde. Wenn Du in Deiner DLL mit new Speicher alloziierst, dann muss das delete auch in einer Funktion dieser DLL stehen. Sonst gibt es Exceptions oder Speicherloecher.

Das Projekt generiert dann einmal eine DLL, die muss dann natuerlich fuer die EXE erreichbar sein, und eine LIB, die Du in Dein EXE-Projekt einbinden musst, genau, wie jede normale LIB.

Das war’s eigentlich. Ist ganz einfach.

–Mathias

Hallo Mathias!

Soweit ich weiß, kann man doch in „Win32 Dynamic-Link Library“ keine Klassen implementieren, sondern nur C-Code! Erst bei MFC-Erweiterungs-Dlls ist dies möglich!

Nur so ein Gedanke von,
KoRn!

Soweit ich weiß, kann man doch in „Win32 Dynamic-Link Library“
keine Klassen implementieren, sondern nur C-Code! Erst bei
MFC-Erweiterungs-Dlls ist dies möglich!

Ich weiss nicht, woher dieses Geruecht kommt, ich habe es schon einmal gehoert. Bevor man so etwas in die Welt setzt, sollte man vielleicht erstmal ausprobieren, ob es geht oder nicht. Dann kaeme man naemlich zu der Einsicht, dass es geht.

–Mathias

Ich weiss nicht, woher dieses Geruecht kommt, ich habe es
schon einmal gehoert. Bevor man so etwas in die Welt setzt,
sollte man vielleicht erstmal ausprobieren, ob es geht oder
nicht. Dann kaeme man naemlich zu der Einsicht, dass es geht.

Hallo Mathias,

also ich habe auch noch nie davon gehoert, dass man
Klassenimplementierungen ueber eine DLL anbieten kann. Da Du Dir
ja so sicher warst, habe ich dann mal folgenden Code erstellt.
Zunaechst die DLL:

// Object.h: Schnittstelle der DLL-Klasse CObject
/////////////////////////////////////////////////
#ifndef \_Object\_DLL\_H
#define \_Object\_DLL\_H

#include "std\_stl.h"

#define BUILD\_DLL

#if defined(BUILD\_DLL)
# define OBJECT\_DLL\_EXP \_\_declspec(dllexport)
#else
# define OBJECT\_DLL\_EXP \_\_declspec(dllimport)
#endif


class OBJECT\_DLL\_EXP CObject
{
public:
 CObject(const string& id = ""):m\_id(id){}

 string getId(void)const;

private:
 string m\_id;
};

#endif // ndef \_Object\_DLL\_H

und die Implementierungsdatei

// Object.cpp: implementierung der DLL\_Klasse CObject
/////////////////////////////////////////////////////

#include "stdafx.h"
#include "Object.h"

string CObject::getId(void)const
{
 return m\_id;
}

Das projekt zum Testen der DLL bindet dann wie ueblich die .lib-
Datei ein und der Compiler-Schalter BUILD_DLL wird nicht mehr
definiert. Das Hauptprogramm sieht dann wie folgt aus:

// main.cpp: implementation of main
///////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "std\_stl.h"
#include 

#include "..\Object.h"


void main(void)
{
 CObject obj1("Object1");

 cout

Beim kompilieren der DLL oder des des hauptprogramms erhalte ich 
folg. Warnung:



    
    h:\c++\classdll\object.h(25) : warning C4251: 'm\_id' : class 'std::basic\_string,class std::allocator \>' benoetigt eine DLL-Schnittstelle, die von Clients von class 'CObject' verwendet wird
    




was immer das auch heissen mag. Beim Ausfuehren des Programms 
crasht es beim Aufruf des Destruktors von CObject. Also entweder 
mache ich etwas falsch oder das geht doch nicht mit Klassen und 
DLL's?

Gruss Rolf

Hallo,

ohne jetzt code parat zu haben: Es geht, ich habe bei einer alten Firma c++ (MVC, stl-konstrukte usw…) über DLL-Grenzen hinweg ausgetauscht. Es gibt auch keinen Grund, warum es nicht gehen sollte. Zu beachten aber ist (und das ist der Grund, warum es COM/CORBA usw. gibt) das:

  • C++ die interne Struktur von Objekten nicht vorgibt. Wie zB virtual implementiert ist oder nicht usw.

  • deshalb das namemangling zuwischen 2 Compilern unterschiedlich ist, damit sich eine MS VC-DLL und eine GCC-DLL ja nicht untereinander „verständigen“ können - denn das wäre fatal!

Also, wenn man C+±DLLs schreiben will, dann nur für

  • am besten eigen Projekte, sonst hat man grosse update probleme!
  • denselben Compiler (zwingend!)

Seht mal bei trolltech ins FAQ zu QT, da steht was dazu.
MfG Diez