C ++ определение dllimport статического члена данных - PullRequest
18 голосов
/ 16 августа 2010

У меня есть класс, который выглядит следующим образом:

//.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

что мне делать?

Ответы [ 3 ]

29 голосов
/ 16 августа 2010

__declspec(dllimport) означает, что текущий код с использованием библиотеки 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.

4 голосов
/ 16 августа 2010

С Документация MSDN ,

Когда вы объявляете класс dllimport, все его функции-члены и статические члены данных импортируются. в отличие от поведение dllimport и dllexport на неклассовые типы, статические члены данных не может указать определение в та же программа, в которой dllimport класс определен .

Надеюсь, это поможет ..

0 голосов
/ 16 августа 2010

если вы импортируете класс, вы импортируете его со всеми его членами, поэтому невозможно определить какой-либо член класса на «стороне клиента».Ключевое слово dllexport должно использоваться от имени реализации dll

...