C++ 静态链接MFC时未修改的Visual Studio 2012 MFC模板中的链接错误

C++ 静态链接MFC时未修改的Visual Studio 2012 MFC模板中的链接错误,c++,visual-c++,mfc,visual-studio-2012,linker-errors,C++,Visual C++,Mfc,Visual Studio 2012,Linker Errors,在Visual Studio 2012中创建最简单类型的新MFC应用程序并将其设置为静态链接到MFC时,链接失败 这里有一个从通过向导创建项目开始,一直到建筑(导致链接器错误)。 其间未进行任何源代码编辑。 错误日志状态为: 1>------ Build started: Project: Test, Configuration: Debug Win32 ------ 1> stdafx.cpp 1> TestDlg.cpp 1> Test.cpp 1> G

在Visual Studio 2012中创建最简单类型的新MFC应用程序并将其设置为静态链接到MFC时,链接失败

这里有一个从通过向导创建项目开始,一直到建筑(导致链接器错误)。 其间未进行任何源代码编辑。

错误日志状态为:

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)" (?AfxRegisterMFCCtrlClasses@@YAXXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj)
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "protected: void __thiscall CMFCControlContainer::PreUnsubclassControl(class CWnd *)" (?PreUnsubclassControl@CMFCControlContainer@@IAEXPAVCWnd@@@Z) already defined in afxnmcdd.lib(afxctrlcontainer2.obj)
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "public: int __thiscall CMFCControlContainer::SubclassDlgControls(void)" (?SubclassDlgControls@CMFCControlContainer@@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 ==========

这就是我吗?您对如何解决这个问题有什么建议吗?

经过测试,v100工作正常,而v110不工作。尝试通过此链接向MS connect报告:

我尝试将我的项目静态链接在一起时遇到了相同的问题


正如Michael Burr所建议的,在stdafx.h中注释掉“define”AFX“NO”MFC“CONTROLS”IN“u”对话框后,这似乎没什么问题。

我遇到了同样的问题。如果您决定在对话框中定义_AFX_NO_MFC_控件_并消除大量MFC开销,您还应该确保将对话框基类、方法调用等从
CDialogEx
更改为
CDialog


如果您不更改对话框的背景颜色或图像,您会发现
CDialogEx
无论如何都是毫无用处的。

如果我不得不冒险猜测,我会说向导坏了。如果您正在链接到静态MFC和CRT,它应该为您处理这个问题。假设您正在使用Unicode支持进行编译(不管怎样,似乎您是;现在谁不支持呢?),对于静态Unicode调试,合适的库似乎是
uafxcwd.lib
。要么第二个库根本不应该存在,要么链接器顺序错误。我很想知道,如果在清除PCH文件后关闭Unicode支持并重建所有文件,会发生什么情况。我认为您应该将此作为错误报告给Microsoft。我想你可以在VS 2012的“帮助”菜单中做到这一点。然后从链接器选项中删除所有看似虚假的库,如
afxnmcdd.lib
,只需重新添加
uafxcwd.lib
。我同意,也许可以添加
/NODEFAULTLIBS
@warren-p。我肯定会这样做,以避免其他人因追查这一问题而感到头痛。希望(?)这是一个实际的错误,而不是特定于我的设置。有关这些符号为什么同时存在于
uafxcw.lib
afxnmcd.lib
中的背景信息,请参阅。由于有意让库具有重复的符号,我认为您可能需要使用
/force:multiple
来使用这组选项进行构建<代码>/force:multiple确实可以使项目得以构建和运行,但我对MFC还不够熟悉,不知道这是一个正确的解决方法/修复方法,还是只是隐藏了一个问题。