2012-11-27 56 views
5

在Visual Studio 2012中創建最簡單的新MFC應用程序並將其設置爲靜態鏈接到MFC時,鏈接失敗。靜態鏈接MFC時,未修改的Visual Studio 2012 MFC模板中的鏈接錯誤

這是gallery of 7 screenshots從項目創建開始,通過嚮導,直到建築物(導致鏈接器錯誤)。 中間沒有進行源代碼編輯。

錯誤日誌狀態:

1>------ Build started: Project: Test, Configuration: Debug Win32 ------ 
1> stdafx.cpp 
1> TestDlg.cpp 
1> Test.cpp 
1> Generating Code... 
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "void __cdecl AfxRegisterMFCCtrlClasses(void)" ([email protected]@YAXXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "protected: void __thiscall CMFCControlContainer::PreUnsubclassControl(class CWnd *)" ([email protected]@@[email protected]@@Z) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "public: int __thiscall CMFCControlContainer::SubclassDlgControls(void)" ([email protected]@@QAEHXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 
1>C:\Users\XXXXXXXX\Documents\Visual Studio 2012\Projects\Test\Debug\Test.exe : fatal error LNK1169: one or more multiply defined symbols found 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

這只是我嗎?你有關於如何解決這個問題的建議嗎?

+2

如果我不得不冒險猜測我會說巫師壞了。如果你鏈接到靜態MFC和CRT,[afx.h中的自動魔術設置](http://msdn.microsoft.com/en-us/library/bx5yfk7t.aspx)應該爲你處理這個問題。假設你使用Unicode支持進行編譯(無論如何,看起來你是誰;誰不是這些日子?)正確的lib似乎是用於static-unicode-debug的'uafxcwd.lib'。第二個庫不應該在那裏,或者鏈接器順序是錯誤的。我很想知道如果你關閉* Unicode支持和重建 - 在吹走你的PCH文件後會發生什麼。 – WhozCraig

+1

我想你應該把這個報告給微軟作爲一個錯誤。我想你可以在VS 2012的幫助菜單中做到這一點。然後從鏈接器選​​項中刪除所有類似'afxnmcdd.lib'的庫,然後加上'uafxcwd.lib'。也許添加'/ NODEFAULTLIBS' –

+0

@ warren-p我同意。我絕對會這樣做,以挽救他人解決這個問題的頭痛。希望(?)這是一個實際的錯誤,而不是特定於我的設置。 – Paul

回答

4

當我嘗試靜態鏈接我的項目在一起時,我得到了同樣的問題。

正如Michael Burr所建議的,在stdafx.h中註釋掉#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS行後,它似乎很好。

2

我遇到過同樣的問題。如果你決定去掉#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS,並且擺脫很多MFC的開銷,你也應該確保你將對話框的基類,方法調用等從CDialogEx改爲CDialog

如果你不改變背景顏色或對話框的圖像,你會發現CDialogEx是無用的。