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 ...

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top