2011-09-13 67 views
5

我想鏈接一個使用winuser.h中聲明和User32.dll中定義的兩個方法的對象文件:GetMonitorInfo和WindowFromMonitor。該源代碼編譯成目標文件就好了,但是當我嘗試鏈接,我碰到下面的錯誤輸出:當鏈接到User32.dll鏈接錯誤2001年

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似乎沒有多個版本可用。

我應該注意到我正在使用庫,鏈接和cl的64位版本。

這裏發生了什麼,以及如何成功鏈接我的程序?

+1

Quacks like macro trouble。 Grep for x ## –

+0

嗯,我沒有找到引起這個問題的宏,只有一個文件引用了這些函數。但是,您的評論確實激發我使用宏來解決該問題。這不是最好的解決方案(它會讓我感到有些傷心),但是這段代碼實際上只需要編譯,而不是維護。 –

回答

2

我不知道你是否能找到解決這個或沒有,但我有同樣的問題,這是發生的是,我有一個文件包含在名爲multimon.h

看起來像的情況下的原因64位編譯,由於宏定義,這些函數的定義來自兩個來源,並且可能來自multimon.h的一個覆​​蓋並且是錯誤的。

我解決了它只是評論這個包括,它已經開始鏈接罰款。

//#include <multimon.h> 
+0

謝謝,我的解決方法是重新定義包含後的宏,但很高興知道實際的解決方案。 –