4

状況:

私は持っている:

class Platform {

public:
   Platform() { count++; cout << getCount();}
   static int getCount() { return count; }

private:
   static int count;

}

これは静的ライブラリとして作成されます。

動的ライブラリ拡張の作成を検討する

class __declspec(dllimport/dllexport) DerivedPlatform : public Platform {

}

はい、私は非 DLL インターフェイス クラスから派生していることを認識しています。

Per:静的フィールドは継承されますか? 、 count の単一のインスタンスのみが存在する必要があります。

ここがトリッキーな部分です。実際には、count の 2 つの異なるコピーが作成されます (count は static と宣言されていますが)。つまり、dll にロードして registerPlatforms() を呼び出すと、DIFFERENT カウント オブジェクトがインクリメントされます。

int main() {

   Platform::count = 0;
   Platform A; // increases count by 1, cout shows 1

   loadPlugin(); // loads the shared library DerivedPlatform
   DerivedPlatform D; // increases count by 1 again, cout shows 2

   cout << Platform::getCount(); // shows 1 !!!!!!

}

これを解決する方法がわかりません。静的変数が 1 つだけ存続するようにする方法。どうやら DLL には静的変数用の独自のヒープがあるようです。

4

1 に答える 1

4

はい、静的ライブラリを実行可能ファイルと DLL の両方にリンクすると、このようなことが起こります。どちらもリンク時に相手を認識していないため、両方がコピーを取得します。通常、コード自体には何の害もありませんが、静的変数の場合は本当に面倒です。

静的ライブラリが既存の DLL またはまったく新しい 3 番目の DLL に含まれるように、ソリューションを再構築する必要があります。または、すべての静的変数を削除します。

于 2012-12-13T23:32:13.057 に答える