C ++ глобальные переменные в DLL - PullRequest
2 голосов
/ 20 сентября 2011

Я написал что-то, чтобы смоделировать библиотеку getopt.h для приложения Windows, и часть этого - глобальная переменная. Это работало нормально, когда я скомпилировал программу как одно приложение; однако, когда я отделил библиотеку getopt и соединился с ней, моя программа начала получать ошибки по умолчанию. Изучая это, кажется, что доступ к переменной извне DLL не работает и возвращает неверный указатель; Что я могу сделать, чтобы это исправить?

Редактировать: если я ввожу функцию в DLL в отладчике, переменная имеет правильное значение - доступ к ней напрямую из приложения дает другое значение.

Ответы [ 2 ]

4 голосов
/ 20 сентября 2011

Возможно, вы неправильно настроили dllexport/dllimport.В результате вы получаете разные копии одной и той же переменной.(один в DLL и один снаружи)

Внутри DLL вам нужно скомпилировать с dllexport, чтобы открыть переменную для клиентского приложения.

Затем в клиентском приложении вам нужнообъявить ту же переменную, что и dllimport.Затем он будет ссылаться на тот, который находится в DLL.

Это немного прискорбно, потому что те же самые заголовки обычно используются для DLL и клиента.Итак, обычный обходной путь таков:

#ifdef COMPILE_DLL
#define DLL_EXPORT  __declspec(dllexport)
#else
#define DLL_EXPORT  __declspec(dllimport)
#endif

РЕДАКТИРОВАТЬ:

Можете ли вы подтвердить, есть ли у вас две копии одной и той же переменной?Попробуйте распечатать адреса как внутри DLL, так и снаружи.

3 голосов
/ 20 сентября 2011

Рассмотрите возможность добавления функции к вашей DLL, которая возвращает значение переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...