it-swarm.com.de

C++ - Definition des statischen Datenelements von dllimport

Ich habe eine Klasse, die wie folgt aussieht:

//.h file
class __declspec(dllimport) MyClass
{
    public:
    //stuff
    private:

    static int myInt;
};

// .cpp file
int MyClass::myInt = 0;

Ich erhalte den folgenden Kompilierungsfehler:

error C2491: 'MyClass::myInt' : definition of dllimport static data member not allowed

was soll ich machen?

18
MBZ

__declspec(dllimport) bedeutet, dass der aktuelle Code verwendet wird the DLL, das Ihre Klasse implementiert. Die Elementfunktionen und statischen Datenelemente werden daher in der DLL definiert. Wenn Sie sie erneut in Ihrem Programm definieren, ist dies ein Fehler.

Wenn Sie versuchen, den Code für DLL zu schreiben, der diese Klasse implementiert (und somit die Member-Funktionen und statischen Daten-Member definiert), müssen Sie stattdessen die Klasse __declspec(dllexport) markieren.

Es ist üblich, dafür ein Makro zu verwenden. Beim Erstellen Ihres DLL definieren Sie ein Makro BUILDING_MYDLL oder ähnliches. In Ihrer Kopfzeile für MyClass haben Sie dann:

#ifdef BUILDING_MYDLL
#define MYCLASS_DECLSPEC __declspec(dllexport)
#else
#define MYCLASS_DECLSPEC __declspec(dllimport)
#endif

class MYCLASS_DECLSPEC MyClass
{
    ...
};

Dies bedeutet, dass Sie den Header zwischen DLL und der Anwendung freigeben können, die die DLL verwendet.

28

Aus der MSDN-Dokumentation ,

Wenn Sie eine Klasse dllimport deklarieren, werden Alle Member-Funktionen und statischen Datenelemente importiert. Im Gegensatz zum Verhalten Von dllimport und dllexport bei Nicht-Klassentypen können statische Datenmember Keine Definition im gleichen Programm Angeben, in dem ein dllimport Klasse ist definiert .

Ich hoffe es hilft..

4
liaK

wenn Sie eine Klasse importieren, importieren Sie sie mit allen it-Mitgliedern. Daher ist es nicht möglich, ein Klassenmitglied auf der "Clientseite" zu definieren. Das dllexport-Schlüsselwort sollte für die Implementierungs-dll verwendet werden

0
user396672