【发布时间】:2012-11-15 09:15:50
【问题描述】:
在 Visual Studio 2012 中创建最简单类型的新 MFC 应用程序并将其设置为静态链接到 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)" (?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 ==========
这只是我吗?您对如何解决这个问题有什么建议吗?
【问题讨论】:
-
如果我不得不冒险猜测,我会说向导坏了。如果您要链接到静态 MFC 和 CRT,auto-magic setup from afx.h 应该会为您解决这个问题。假设您正在使用 Unicode 支持进行编译(无论如何,您似乎是;现在谁不支持?)对于 static-unicode-debug,正确的库似乎是
uafxcwd.lib。第二个库根本不应该存在,或者链接器顺序错误。我很想知道如果您在删除 PCH 文件后关闭 关闭 Unicode 支持并重新构建会发生什么。 -
我认为您应该将此作为错误报告给 Microsoft。我认为您可以直接从 VS 2012 的“帮助”菜单中执行此操作。然后从链接器选项中删除所有看起来像
afxnmcdd.lib的虚假库,然后添加回uafxcwd.lib。也许添加/NODEFAULTLIBS -
@warren-p 我同意。我肯定会这样做,以免其他人为追踪这个问题而头疼。希望(?)这是一个实际的错误,而不是特定于我的设置。
-
请参阅blogs.msdn.com/b/vcblog/archive/2012/02/06/10263387.aspx 了解这些符号为何同时存在于
uafxcw.lib和afxnmcd.lib中的一些背景知识。由于库有重复的符号是有意的,我认为您可能需要使用/force:multiple来使用这组选项进行构建。/force:multiple确实使项目能够构建和运行,但我对 MFC 真的不够熟悉,不知道这是否是正确的解决方法/修复,或者它是否只是隐藏了一个问题。
标签: c++ visual-c++ mfc visual-studio-2012 linker-errors