Domanda

Ho una classe come

class K {
  static int a;
  static int b;
}

Vorrei creare una libreria condivisa (dll) contenente questa classe K . In un file cpp compilato nella libreria che chiamo

int K::a = 0;
int K::b = 0;

per istanziare le variabili statiche. La dll si compila senza errori, ma quando uso la libreria, ottengo l'errore di simbolo esterno non risolto per i membri K :: a e K :: b . Nel programma principale in cui voglio usarlo, includo la stessa intestazione con la dichiarazione della classe K , l'unica differenza è che per la libreria uso class __declspec (dllexport) K {...} e per il programma principale classe K {...}

Probabilmente sto facendo più di un errore, quindi le mie domande sarebbero, come posso

  • dire al linker di condividere la classe membro statica nella libreria?
  • utilizzare i membri della classe statica istanziati nella libreria nel programma principale?

PS. Uso Visual Studio 2008 ...

È stato utile?

Soluzione

Si dovrebbe usare __declspec (dllimport) nell'intestazione dell'applicazione principale.

Quindi ecco la soluzione. Il file di intestazione (incluso nella libreria e nell'applicazione principale) è:

#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;
}

Il file cpp nella libreria contiene:

int K::a = 0;
int K::b = 0;

Per compilare la libreria è necessario definire la macro COMPILE_DLL, per l'applicazione principale non dovrebbe essere definita.

Altri suggerimenti

Collega la libreria staticamente anziché dinamicamente.

Oppure aggiungi una funzione globale nella DLL che restituisce i valori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top