Membri di classe statici nella libreria condivisa
-
06-07-2019 - |
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 ...
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.