質問

次のようなクラスがあります

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

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

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

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

たぶん私は複数の間違いをしているので、私の質問はどうすればいいですか

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

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

役に立ちましたか?

解決

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

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top