Miembros de clase estática en biblioteca compartida
-
06-07-2019 - |
Pregunta
Tengo una clase como
class K {
static int a;
static int b;
}
Me gustaría crear una biblioteca compartida (dll) que contenga esta clase K
. En un archivo cpp compilado en la biblioteca que llamo
int K::a = 0;
int K::b = 0;
para instanciar las variables estáticas. El dll se compila sin errores, pero cuando uso la biblioteca, obtengo el error de símbolo externo sin resolver para los miembros K :: a
y K :: b
. En el programa principal donde quiero usarlo, incluyo el mismo encabezado con la declaración de la clase K
, la única diferencia es que para la biblioteca uso class __declspec (dllexport) K {...}
y para el programa principal clase K {...}
Probablemente estoy cometiendo más de un error, así que mis preguntas serían, ¿cómo puedo
- ¿le dice al enlazador que comparta la clase de miembro estático en la biblioteca?
- usa los miembros de la clase estática instanciados en la biblioteca en el programa principal?
PS. Yo uso Visual Studio 2008 ...
Solución
Se debe usar __declspec (dllimport)
en el encabezado de la aplicación principal.
Entonces aquí está la solución. El archivo de encabezado (incluido tanto en la biblioteca como en la aplicación principal) es:
#ifdef COMPILE_DLL
#define DLL_SPEC __declspec( dllexport )
#else
#define DLL_SPEC __declspec( dllimport )
#endif
class DLL_SPEC K {
static int a;
static int b;
}
El archivo cpp en la biblioteca contiene:
int K::a = 0;
int K::b = 0;
Para compilar la biblioteca, hay que definir la macro COMPILE_DLL, para la aplicación principal no se debe definir.
Otros consejos
Enlace la biblioteca estáticamente en lugar de dinámicamente.
O agregue una función global en la DLL que devuelva los valores.