在静态链接MFC时,未修改的Visual Studio 2012 MFC模板中出现链接错误

6
当在Visual Studio 2012中创建一个最简单的MFC应用程序,并将其设置为静态链接到MFC时,链接失败。
这里是一个7张截图的画廊,从向导创建项目开始,一直到构建(导致链接器错误)。 在此期间没有进行源代码编辑。 错误日志显示:
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 ==========

这只是我一个人的问题吗?你有没有解决方法的建议?


2
如果我要猜的话,我会说向导已经损坏了。如果您正在链接到静态MFC和CRT,则afx.h中的自动设置应该为您处理此问题。假设您正在使用Unicode支持进行编译(无论如何,似乎是这样的;现在谁不使用呢?),则适当的库似乎是uafxcwd.lib用于静态-unicode-debug。第二个库要么根本不存在,要么链接器顺序错误。如果您关闭Unicode支持并在清除PCH文件后重新构建所有内容,我很想知道会发生什么。 - WhozCraig
1
我认为你应该将此作为错误报告给微软。我认为你可以直接从VS 2012的帮助菜单中完成。然后从链接器选项中删除所有看起来虚假的库,例如afxnmcdd.lib,只添加回uafxcwd.lib。也许还要添加/NODEFAULTLIBS - Warren P
@warren-p 我同意。我一定会这样做,以便为其他人节省追踪此问题的麻烦。希望这是一个实际的错误,而不是我设置特定的问题。 - Paul
4
请参考http://blogs.msdn.com/b/vcblog/archive/2012/02/06/10263387.aspx了解这些符号为什么同时存在于`uafxcw.lib`和`afxnmcd.lib`中的背景。由于库中有重复的符号是有意的,因此我认为您可能需要使用`/force:multiple`选项来构建。 /force:multiple确实可以使项目构建和运行,但我不太熟悉MFC,无法确定这是否是正确的解决方法或者只是掩盖了问题。 - Michael Burr
3个回答

5

当我尝试将我的项目进行静态链接时,我遇到了同样的问题。

正如Michael Burr所建议的那样,在stdafx.h中注释掉#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS这一行后,问题似乎得以解决。


2
我遇到了同样的问题。如果你决定定义#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS来减少MFC的负担,那么你还需要确保将对话框基类、方法调用等从CDialogEx改为CDialog
如果你不改变对话框的背景颜色或图像,那么CDialogEx也就没什么用了。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接