2015-09-26 2 views
0

У меня есть проект Visual Studio C++, содержащий основную программу и DLL-модуль. DLL, имеет класс со следующим определением:C++ dllimport: нерешенные внешние с статическими полями

// .h 
#ifdef _USRDLL 
    #define DLLAPI __declspec(dllexport) 
#else 
    #define DLLAPI __declspec(dllimport) 
#endif 

class DLLAPI EClass 
{ 
public: 
    static int value; 

    static int get_value(); 
}; 

// .cpp 
int EClass::value = 1; 

int EClass::get_value() 
{ 
    return value; 
} 

Проект DLL успешно компилируется, оба символа (значение и get_value) наблюдаются на Dependency Walker.

В основной программе, я могу вызвать статическую функцию get_value

int v = EClass::get_value(); // Ok, v = 1 

, но когда я пытаюсь получить доступ поле value непосредственно

int v = EClass::value; // Error 

Я получаю сообщение об ошибке

LNK2001 unresolved external symbol "public: static int EClass::value" ([email protected]@@2HA) 

Можно избежать использования аксессуаров для статических полей?

+0

Похоже, что вы не экспортируете статический файл, пытались ли вы добавить 'DLLAPI' перед его объявлением? (за пределами класса) – SHR

+0

, возможно, также нужно добавить в заголовок: 'extern DLLAPI int EClass :: value;' сообщить вашему приложению dllimport. – SHR

+0

Да, я пробовал это без успеха. Статическое поле экспортируется правильно: у меня есть доступ к нему с помощью метода accessor, и я вижу это поле в DLL. –

ответ

0

Макрос _USRDLL должен быть определен только в проекте DLL.

Смежные вопросы