减小 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 类,如CDialogExCWinAppEx(MFC 应用程序向导默认使用它们)。将它们替换为 CDialogCWinApp。之后,您可能会从初始化各种 GUI“管理器”实例的代码中得到一些编译器错误。只需删除此代码即可。

更简单的是,在使用 MFC 应用程序向导创建新应用程序时,将复选框设置为“无扩展 MFC 控件”(仅适用于基于对话框的应用程序)。然后它不会生成使用CDialogExCWinAppEx 的代码,我认为它也会定义_AFX_NO_MFC_CONTROLS_IN_DIALOGS

【讨论】:

以上是关于减小 MFC 应用程序大小的主要内容,如果未能解决你的问题,请参考以下文章

减小VS2012生成的exe的文件大小的一种方法

减小VS2012生成的exe的文件大小的一种方法

减小iOS应用程序的大小

减小一些 pdf 文件的大小

使用 NDK 时减小应用程序大小

使用 Asset Catalog 减小应用程序文件大小的方法