【发布时间】:2017-03-02 19:52:41
【问题描述】:
我想为 MFC 项目定义 _AFX_NO_MFC_CONTROLS_IN_DIALOGS。这个定义应该大大减少可执行文件的大小。详情请见https://blogs.msdn.microsoft.com/vcblog/2012/02/06/reducing-the-size-of-statically-linked-mfc-applications-in-vc11/。
我使用向导创建了一个“Mfc 应用程序”。我保留了所有默认选项,除了我使用“在静态库中使用 MFC”(这对我来说是强制性的)。
此时,项目构建完成。
然后,我在 stdafx.h 文件中添加以下行:
#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS
此时,我收到一些链接器错误:
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)
但是,如果我进入项目设置并将字符集从 Unicode 更改为多字节,一切都很好。有人知道发生了什么吗? 我需要将此更改集成到一些大而老的 MFC 项目中,因此我绝对需要保留“使用 Unicode 字符集”标志。
【问题讨论】:
-
为了安全起见,您应该始终在命令行 (
/Dcompiler switch) 上传递全局标志(如_AFX_NO_MFC_CONTROLS_IN_DIALOGS)。 -
是的,我在 stdafx.h 和预处理器定义中都试过了,但没有改变。
-
确定您没有编译可能没有设置此标志的其他文件或库?所有使用 MFC 的 Lib 和目标文件都必须使用此开关进行编译...
-
是的,这甚至不适用于使用向导创建的全新默认 MFC 应用程序