2011-09-13 20 views
5

Estoy intentando vincular un archivo de objeto que utiliza dos métodos declarados en winuser.h y definidos en User32.dll: GetMonitorInfo y WindowFromMonitor. La fuente se compila en un fichero objeto muy bien, pero cuando intento de vincular, me sale el siguiente salida de error:Error de enlace 2001 al vincular a User32.dll

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

La cosa es, no me llaman "xGetMonitorInfo" o "xMonitorFromWindow". La ejecución de grep en todos los archivos fuente muestra que solo se están llamando a "GetMonitorInfo" y a "WindowFromMonitor". Estoy correctamente incluyendo windows.h, que incluye winuser.h. También estoy configurando correctamente mi LIBPATH en las opciones del enlazador, que se confirma mediante la salida del enlace detallado.

Lo siguiente también aparece en mi salida verbosa enlace:

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) 

Además, GetMonitorInfo se define en winuser.h como:

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 

Cuando cambio toda referencia a "GetMonitorInfo" a " GetMonitorInfoA ", solo obtengo

D3dCtx.obj: error LNK2001: símbolo externo no resuelto xMonitorFromWindow

como resultado de error de mi enlazador. Desafortunadamente, MonitorFromWindow no parece tener múltiples versiones disponibles.

Debo notar que estoy usando las versiones de 64 bits de las bibliotecas, enlaces y cl.

¿Qué está pasando aquí y cómo puedo vincular correctamente mi programa?

+1

Quacks like macro trouble. Grep para x ## –

+0

Bueno, no encontré la macro que estaba causando esto, y solo un archivo hace referencia a estas funciones. Sin embargo, su comentario me inspiró a evitar el problema usando macros. No es la mejor solución (y me duele un poco), pero este código realmente solo necesita ser compilado, no mantenido. –

Respuesta

2

No sé si se haya podido encontrar solución a esto o no, pero tenía el mismo problema y la razón de esto sucedía era que tenía un archivo incluido el nombre multimon.h

Parece que en el caso de Compilación de 64 bits, debido a las definiciones de Macro, las definiciones de estas funciones provienen de dos fuentes y probablemente una de multimon.h está sobrescrito y es incorrecta.

Lo resolví comentando esto y ha comenzado a enlazar correctamente.

//#include <multimon.h> 
+0

Gracias, mi trabajo fue simplemente para redefinir las macros después de las inclusiones, pero es bueno saber la solución real. –

Cuestiones relacionadas