静态链接MFC时重复符号

时间:2015-03-03 09:03:55

标签: c++ visual-studio dll mfc

我有一个解决方案,几个月来一直很好。昨天我执行了一次完全重建,之后执行了一次干净,以减少备份的解决方案大小,但其中一个子项目无法链接。

一些背景知识:

此子项目是一个始终静态链接到MFC的DLL,但最近更改为动态链接,因为它被认为是静态的原因不再是问题(它之前被MFC应用程序使用在VC ++ 6下,这是一个VS 2013 MFC DLL,但主应用程序已经迁移到同一个VS 2013解决方案,所以他们都应该很高兴动态链接到相同版本的MFC,不应该这样吗? )。事实证明,DLL链接但在动态构建时对DoModal()的调用崩溃(如果你是这样的话,请在明信片上单独提问这个问题)。所以我把它换回静态。

回到正确的问题:

在使用静态链接重建时,我收到以下错误:

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) 

在线搜索此问题我明白只需注释掉

就可以解决这个问题
#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS

在cuplprit项目的stdafx.h中。但真正困扰我的是为什么这只是现在才有必要,经过多次静态链接而没有问题?该项目还没有坐在那里,不需要重建,它已被改变并重建了很多次。那么当在静态/动态之间切换时,某些VS向导是否在某个时刻插入了该行?如果在使用它时无法静态链接,为什么还要先定义一些?

所以我现在一切都在运作,我只是好奇这是怎么发生的......

编辑:

我忘了提到这个问题的第一个答案也让我有点担心,因为我现在已经删除了#define但仍然有一个CDialogEx派生类: Link Errors in Unmodified Visual Studio 2012 MFC Template when Statically Linking MFC

0 个答案:

没有答案