2009-06-18 12 views
3

で私は、このクラスKを含む共有ライブラリ(DLL)を作成したいと思います静的クラスメンバーの共有ライブラリ

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

のようなクラスを持っています。ライブラリでコンパイルされたcppファイルでは、静的変数をインスタンス化するために

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

と呼びます。 DLLはエラーなくコンパイルされますが、ライブラリを使用すると、メンバーK::aおよびK::bの未解決の外部シンボルエラーが発生します。私はそれを使用するメインプログラムでは、私はクラスKの宣言と同じヘッダーが含まれ、唯一の違いは、ライブラリのために、私はclass __declspec(dllexport) K { ... }を使用して、メインプログラムおそらくclass K { ... }

のために、私はより多くのをやっているということです1つの間違いよりも私の質問は、どのようにすることができます

  • ライブラリ内の静的メンバークラスを共有するようにリンカーに指示しますか?
  • メインプログラムのライブラリでインスタンス化された静的クラスメンバーを使用しますか?

PS。私はVisual Studio 2008を使用しています...

答えて

1

メインアプリケーションのヘッダーに__declspec(dllimport)を使用する必要があります。

これは解決策です。 (ライブラリとメインアプリケーションの両方に含まれる)ヘッダファイルである:

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

ライブラリにおけるCPPファイルが含ま:

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

一つはマクロCOMPILE_DLLを定義しなければならないライブラリをコンパイルするには、主なアプリケーションについては、定義するべきではありません。

0

動的にではなく静的にlibararyをリンクします。

また、値を返すグローバル関数をDLLに追加します。

関連する問題