Question

j'ai une classe comme

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

Je voudrais créer une bibliothèque partagée (dll) contenant cette classe K . Dans un fichier cpp compliqué dans la bibliothèque que j'appelle

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

pour instancier les variables statiques. La dll se compile sans erreur, mais lorsque j'utilise la bibliothèque, j'obtiens l'erreur de symbole externe non résolue pour les membres K :: a et K :: b . Dans le programme principal où je veux l'utiliser, j'inclus le même en-tête avec la déclaration de la classe K , la seule différence est que pour la bibliothèque j'utilise classe __declspec (dllexport) K {...} et pour le programme principal classe K {...}

Je fais probablement plus d'une erreur, alors mes questions seraient: comment puis-je

  • demander à l'éditeur de liens de partager la classe de membre statique dans la bibliothèque?
  • utiliser les membres statiques de la classe instanciés dans la bibliothèque du programme principal?

PS. J'utilise Visual Studio 2008 ...

Était-ce utile?

La solution

Il faut utiliser __ declspec (dllimport) dans l'en-tête de l'application principale.

Alors voici la solution. Le fichier d’en-tête (inclus à la fois dans la bibliothèque et dans l’application principale) est le suivant:

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

Le fichier cpp de la bibliothèque contient:

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

Pour compiler la bibliothèque, vous devez définir la macro COMPILE_DLL. Elle ne doit pas être définie pour l'application principale.

Autres conseils

Liez la bibliothèque de manière statique au lieu de dynamiquement.

Ou ajoutez une fonction globale dans la DLL qui renvoie les valeurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top