我想为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 Application"使用向导。我保留了所有默认选项,除了我使用"在静态库中使用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更改为Multi-Byte,一切都很好..有人知道发生了什么吗? 我需要将这个变化集成到一些大型和旧的MFC项目中,所以我绝对需要保持"使用Unicode字符集"标志。
答案 0 :(得分:2)
定义_AFX_NO_MFC_CONTROLS_IN_DIALOGS
是不够的,您必须确保不使用CDialogEx
和CWinAppEx
等扩展MFC类(默认情况下由MFC应用程序向导使用) 。将其替换为CDialog
和CWinApp
。之后,您可能会从初始化各种GUI“管理器”实例的代码中获得一些编译器错误。只需删除此代码。
使用MFC应用程序向导创建新应用程序时,更容易设置“无扩展MFC控件”复选框(仅适用于基于对话框的应用程序)。然后它不会生成使用CDialogEx
和CWinAppEx
的代码,我认为它也会定义_AFX_NO_MFC_CONTROLS_IN_DIALOGS
。