У меня есть проект Visual Studio C ++, содержащий основную программу и модуль DLL. В DLL есть класс со следующим определением:
// .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" (?value@EClass@@2HA)
Можно ли избежать использования аксессоров для статических полей?
DLLAPI
перед ее объявлением? (для вне класса) - person SHR   schedule 27.09.2015extern DLLAPI int EClass::value;
, чтобы ваше приложение могло импортировать его в dll. - person SHR   schedule 27.09.2015_USRDLL
вместо уникального макроса для каждой dll может вызвать проблему, в любом случае для одной dll и одного exe, использующего его, он работает для меня без каких-либо изменений в моей Visual Studio 10 Express. - person SHR   schedule 27.09.2015_USRDLL
макросе, определенном в конфигурациях проекта DLL и EXE. Понятия не имею, как это произошло. Теперь все работает нормально. - person Andrey Nasonov   schedule 27.09.2015