Frage

Ich habe eine Klasse wie

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

Ich möchte eine gemeinsam genutzte Bibliothek (DLL), die diese Klasse K erstellen. In einer CPP-Datei in der Bibliothek compliled Ich nenne

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

die statischen Variablen instanziiert. Die DLL wird ohne Fehler kompilieren, aber wenn ich die Bibliothek verwenden, erhalte ich den nicht aufgelösten externe Symbol Fehler für die Mitglieder K::a und K::b. Im Hauptprogramm, wo ich es verwenden will, schließe ich den gleichen Header mit der Deklaration der Klasse K, ist der einzige Unterschied, dass für die Bibliothek verwende ich class __declspec( dllexport ) K { ... } und für das Hauptprogramm class K { ... }

Wahrscheinlich mache ich mehr als einen Fehler, so meine Fragen wären, wie kann ich

  • sagen, der Linker die statische Member-Klasse in der Bibliothek zu teilen?
  • verwenden, um die statischen Klassenmitglieder in der Bibliothek im Hauptprogramm instanziiert?

PS. Ich benutze Visual Studio 2008 ...

War es hilfreich?

Lösung

Man sollte __declspec( dllimport ) im Header in der Hauptanwendung verwendet werden.

So, hier ist die Lösung. Die Header-Datei (enthalten in der Bibliothek und der Hauptanwendung) ist:

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

Die CPP-Datei in der Bibliothek enthält:

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

, um die Bibliothek zu kompilieren hat man das Makro COMPILE_DLL zu definieren, für die Hauptanwendung sollte es nicht definiert werden.

Andere Tipps

Verknüpfen Sie die Bibliothek statisch statt dynamisch.

oder eine globale Funktion in der DLL hinzufügen, die die Werte zurückgibt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top