3

私は次のようなクラスを持っています

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

このクラスを含む共有ライブラリ(dll)を作成したいと思いますK。私が呼び出すライブラリでコンパイルされたcppファイルで

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

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

おそらく私は複数の間違いをしているので、私の質問はどうすればいいですか?

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

PS。VisualStudio2008を使用しています...

4

2 に答える 2

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を定義する必要があります。メインアプリケーションでは、マクロを定義しないでください。

于 2009-06-18T19:50:32.443 に答える
0

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

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

于 2009-06-18T19:12:52.880 に答える