Ошибка ссылки 2001 при ссылке на User32.dll - PullRequest
5 голосов
/ 13 сентября 2011

Я пытаюсь связать объектный файл, который использует два метода, объявленных в winuser.h и определенных в User32.dll: GetMonitorInfo и WindowFromMonitor. Исходный код компилируется в объектный файл просто отлично, но когда я пытаюсь связать, я получаю следующее сообщение об ошибке:

D3dCtx.obj : error LNK2001: unresolved external symbol xGetMonitorInfo
D3dCtx.obj : error LNK2001: unresolved external symbol xMonitorFromWindow

Дело в том, что я не называю "xGetMonitorInfo" или "xMonitorFromWindow". Запуск grep для всех исходных файлов показывает, что вызываются только «GetMonitorInfo» и «WindowFromMonitor». Я правильно включаю windows.h, который включает в себя winuser.h. Я также правильно устанавливаю свою LIBPATH в параметрах компоновщика, что подтверждается подробным выводом ссылки.

В моих подробных выходных ссылках также указано следующее:

Found __imp_GetMonitorInfoA
    Referenced in nafxcw.lib(afxribboncategory.obj)
    Referenced in nafxcw.lib(afxtooltipctrl.obj)
    Referenced in nafxcw.lib(afxribbonkeytip.obj)
    Referenced in nafxcw.lib(afxfullscreenimpl.obj)
    Referenced in nafxcw.lib(afxframeimpl.obj)
    Referenced in nafxcw.lib(afxglobalutils.obj)
    Referenced in nafxcw.lib(afxdropdowntoolbar.obj)
    Referenced in nafxcw.lib(wincore.obj)
    Referenced in nafxcw.lib(afxglobals.obj)
    Referenced in nafxcw.lib(afxpopupmenu.obj)
    Referenced in nafxcw.lib(afxpropertygridtooltipctrl.obj)
    Loaded User32.lib(USER32.dll)
Found __imp_MonitorFromWindow
    Referenced in nafxcw.lib(wincore.obj)
    Loaded User32.lib(USER32.dll)

Кроме того, GetMonitorInfo определен в winuser.h как:

WINUSERAPI
BOOL
WINAPI
GetMonitorInfoA(
    __in HMONITOR hMonitor,
    __inout LPMONITORINFO lpmi);
WINUSERAPI
BOOL
WINAPI
GetMonitorInfoW(
    __in HMONITOR hMonitor,
    __inout LPMONITORINFO lpmi);
#ifdef UNICODE
#define GetMonitorInfo  GetMonitorInfoW
#else
#define GetMonitorInfo  GetMonitorInfoA
#endif // !UNICODE

Когда я меняю все ссылки на «GetMonitorInfo» на «GetMonitorInfoA», я получаю только

D3dCtx.obj: ошибка LNK2001: неразрешенный внешний символ xMonitorFromWindow

как вывод ошибки моего компоновщика. К сожалению, в MonitorFromWindow, похоже, нет нескольких доступных версий.

Следует отметить, что я использую 64-битные версии библиотек, ссылки и кл.

Что здесь происходит, и как я могу успешно связать свою программу?

1 Ответ

2 голосов
/ 21 марта 2013

Я не знаю, смогли ли вы найти решение этой проблемы или нет, но у меня была та же проблема, и причина, по которой это происходило, заключалась в том, что у меня был файл с именем multimon.h

Похожев случае 64-битной компиляции из-за определений макросов определения этих функций происходят из двух источников, и, вероятно, один из multimon.h переопределяет и является неправильным.

Я решил это, просто закомментировав это:и он начал нормально связываться.

//#include <multimon.h>
...