web-dev-qa-db-ja.com

dllimport静的データメンバーのC ++定義

以下のようなクラスがあります:

//.h file
class __declspec(dllimport) MyClass
{
    public:
    //stuff
    private:

    static int myInt;
};

// .cpp file
int MyClass::myInt = 0;

次のコンパイルエラーが発生します。

error C2491: 'MyClass::myInt' : definition of dllimport static data member not allowed

私は何をすべきか?

19
MBZ

__declspec(dllimport)は、現在のコードがsingクラスを実装するDLLであることを意味します。メンバー関数と静的データメンバーはDLLで定義されています、プログラムでそれらを再度定義するとエラーになります。

このクラスを実装するDLLのコードを記述しようとしている場合(したがって、メンバー関数と静的データメンバーを定義している場合)、クラスをマークする必要があります__declspec(dllexport)代わりに。

これにはマクロを使用するのが一般的です。 DLLをビルドするときに、マクロを定義しますBUILDING_MYDLL または類似。 MyClassのヘッダーには、次のようになります。

    #ifdef _MSC_VER
    #  ifdef BUILDING_MYDLL
    #    define MYCLASS_DECLSPEC __declspec(dllexport)
    #  else
    #    define MYCLASS_DECLSPEC __declspec(dllimport)
    #  endif
    #endif

    class MYCLASS_DECLSPEC MyClass
    {
        ...
    };

これは、DLLとDLLを使用するアプリケーションの間でヘッダーを共有できることを意味します。

29

MSDN Documentation から、

クラスdllimportを宣言すると、そのすべてのメンバー関数と静的データメンバーがインポートされます。非クラス型でのdllimportおよびdllexportの動作とは異なり、静的データメンバーは、dllimportクラスが定義されている同じプログラムで定義を指定できません

それが役に立てば幸い..

4
liaK

クラスをインポートする場合は、すべてのメンバーとともにインポートするため、「クライアント側」でクラスメンバーを定義することはできません。 dll実装キーワードの代わりにdllexportキーワードを使用する必要があります

0
user396672