2010-08-16 10 views
17

ich eine Klasse, die wie unten aussieht:C++ Definition von Dllimport statischem Datenelement

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

    static int myInt; 
}; 

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

ich den folgenden Compiler-Fehler erhalten:

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

, was soll ich tun?

Antwort

25

__declspec(dllimport) bedeutet, dass der aktuelle Code ist mit die DLL, die Ihre Klasse implementiert. Die Elementfunktionen und statischen Datenelemente werden daher in der DLL definiert, und ihre erneute Definition in Ihrem Programm ist ein Fehler. Wenn Sie versuchen, den Code für die DLL zu schreiben, die diese Klasse implementiert (und damit die Elementfunktionen und statischen Datenelemente definiert), müssen Sie stattdessen die Klasse __declspec(dllexport) markieren.

Es ist üblich, dafür ein Makro zu verwenden. Wenn Sie Ihre DLL erstellen, definieren Sie ein Makro BUILDING_MYDLL oder ähnliches. In der Kopfzeile für MyClass Sie dann haben:

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

class MYCLASS_DECLSPEC MyClass 
{ 
    ... 
}; 

Dies bedeutet, dass Sie die Header zwischen dem DLL gemeinsam nutzen können und die Anwendung, die die DLL verwendet.

+1

Hier ist das entsprechende Zitat auf [Microsoft-Seite] (http://msdn.microsoft.com/de-de/library/8fskxacy.aspx): "__declspec (dllimport) ist optional auf Funktionsdeklarationen [...] Sie müssen jedoch __declspec (dllimport) für die importierende ausführbare Datei verwenden, um auf die öffentlichen Datensymbole und -objekte der DLL zuzugreifen. Beachten Sie, dass die Benutzer Ihrer DLL noch mit einer Importbibliothek verknüpfen müssen. " –

0

Wenn Sie eine Klasse importieren, importieren Sie sie mit allen it-Mitgliedern, so dass es unmöglich ist, auf der "Client-Seite" ein Mitglied der Klasse zu definieren. Dllexport Schlüsselwort sollte im Namen der Umsetzung dll

4

Von MSDN Documentation verwendet werden,

When you declare a class dllimport, all its member functions and static data members are imported. Unlike the behavior of dllimport and dllexport on nonclass types, static data members cannot specify a definition in the same program in which a dllimport class is defined.

Hoffe, es hilft ..