2011-09-13 23 views
5

Sto provando a collegare un file oggetto che utilizza due metodi dichiarati in winuser.h e definito in User32.dll: GetMonitorInfo e WindowFromMonitor. La fonte compila in un file oggetto bene, ma quando provo a collegare, ottengo il seguente output di errore:Errore di collegamento 2001 durante il collegamento a User32.dll

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

Il fatto è che non mi chiamano "xGetMonitorInfo" o "xMonitorFromWindow". L'esecuzione di grep su tutti i file sorgente mostra che vengono chiamati solo "GetMonitorInfo" e "WindowFromMonitor". Sto includendo correttamente windows.h, che include winuser.h. Sto anche impostando correttamente il mio LIBPATH nelle opzioni del linker, che è confermato dall'output del link dettagliato.

Di seguito appare anche nel mio verbose uscita link:

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) 

Inoltre, GetMonitorInfo è definito in Winuser.h come:

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 

Quando cambio ogni riferimento a "GetMonitorInfo" a " GetMonitorInfoA ", ottengo solo

D3dCtx.obj: errore LNK2001: simbolo esterno non risolto xMonitorFromWindow

come output del mio errore del linker. Sfortunatamente, MonitorFromWindow non sembra avere più versioni disponibili.

Devo notare che sto usando le versioni a 64 bit delle librerie, link e cl.

Cosa sta succedendo qui e come posso collegare correttamente il mio programma?

+1

Cogne come problemi di macro. Grep for x ### –

+0

Bene, non ho trovato la macro che stava causando questo, e solo un file fa riferimento a queste funzioni. Tuttavia, il tuo commento mi ha ispirato a risolvere il problema utilizzando le macro. Non è la soluzione migliore (e mi fa un po 'male), ma questo codice deve solo essere compilato, non mantenuto. –

risposta

2

Non so se eri in grado di trovare una soluzione a questo o no, ma ho avuto lo stesso problema e la ragione per questo stava accadendo era che avevo un file di nome inclusa multimon.h

Sembra che in caso di Compilazione a 64 bit, a causa delle definizioni di macro, le definizioni di queste funzioni provengono da due fonti e probabilmente una da multimon.h è prioritaria e sbagliata.

Ho risolto semplicemente commentando questa inclusione e ha iniziato a collegare bene.

//#include <multimon.h> 
+0

Grazie, la mia soluzione era solo ridefinire i macro dopo gli include, ma è bello conoscere la soluzione reale. –

Problemi correlati