减小 MFC 应用程序大小
Posted
技术标签:
【中文标题】减小 MFC 应用程序大小【英文标题】:Reduce MFC application size 【发布时间】: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 字符集”标志。
【问题讨论】:
为了安全起见,您应该始终在命令行 (/D
compiler switch) 上传递全局标志(如 _AFX_NO_MFC_CONTROLS_IN_DIALOGS
)。
是的,我在 stdafx.h 和预处理器定义中都试过了,但没有改变。
确定您没有编译可能没有设置此标志的其他文件或库?所有使用 MFC 的 Lib 和目标文件都必须使用此开关进行编译...
是的,这甚至不适用于使用向导创建的全新默认 MFC 应用程序
【参考方案1】:
定义_AFX_NO_MFC_CONTROLS_IN_DIALOGS
是不够的,您必须确保不使用扩展的MFC 类,如CDialogEx
和CWinAppEx
(MFC 应用程序向导默认使用它们)。将它们替换为 CDialog
和 CWinApp
。之后,您可能会从初始化各种 GUI“管理器”实例的代码中得到一些编译器错误。只需删除此代码即可。
更简单的是,在使用 MFC 应用程序向导创建新应用程序时,将复选框设置为“无扩展 MFC 控件”(仅适用于基于对话框的应用程序)。然后它不会生成使用CDialogEx
和CWinAppEx
的代码,我认为它也会定义_AFX_NO_MFC_CONTROLS_IN_DIALOGS
。
【讨论】:
以上是关于减小 MFC 应用程序大小的主要内容,如果未能解决你的问题,请参考以下文章