2010-08-16 21 views
17

tengo una clase que se parece a continuación:C++ definición de miembro de datos estáticos dllimport

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

    static int myInt; 
}; 

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

me sale el siguiente error de compilación:

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

¿qué debería hacer?

Respuesta

25

__declspec(dllimport) significa que el código actual es usando la DLL que implementa su clase. Por lo tanto, las funciones miembro y los miembros de datos estáticos se definen en la DLL y su definición en el programa es un error.

Si está intentando escribir el código para la DLL que implementa esta clase (y así define las funciones miembro y los miembros de datos estáticos), entonces necesita marcar la clase __declspec(dllexport) en su lugar.

Es común usar una macro para esto. Cuando construye su DLL, defina una macro BUILDING_MYDLL o similar. En la cabecera de MyClass usted entonces tiene:

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

class MYCLASS_DECLSPEC MyClass 
{ 
    ... 
}; 

Esto significa que se puede compartir entre la cabecera de la DLL y la aplicación que utiliza el archivo DLL.

+1

Aquí está la cita correspondiente en [la página de Microsoft] (http://msdn.microsoft.com/de-de/library/8fskxacy.aspx): "Usar __declspec (dllimport) es opcional en las declaraciones de funciones [... ]. Sin embargo, debe usar __declspec (dllimport) para que el archivo ejecutable de importación tenga acceso a los símbolos y objetos de datos públicos de la DLL. Tenga en cuenta que los usuarios de su DLL aún necesitan vincularse con una biblioteca de importación. " –

0

si está importando una clase, la está importando con todos sus miembros, por lo que es imposible definir cualquier miembro de la clase en el "lado del cliente". dllexport palabra clave se debe utilizar en nombre de la aplicación DLL

4

De MSDN Documentation,

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.

creo que sirve ..

Cuestiones relacionadas