从 Visual Studio 2008 升级到 Visual Studio 2013 时,二进制大小增加了 30%

Binary size grows 30% when upgrading from Visual Studio 2008 to Visual Studio 2013

我必须维护一个庞大、陈旧的代码库(不是我写的),其中包含多个项目,其中大部分是 C++ 语言。我的第一步是将代码库从 VS 2008 升级到 VS 2013。

两种解决方案都设置为针对大小进行优化(在发布版本中)。然而,二进制文件的大小现在大约增加了 30%,几乎在所有二进制文件中都是如此——我很难解释。

项目大量使用 ATL,我知道 ATL 9 已移至静态库,但我怀疑这能否解释所有大小差异。

任何想法:

  1. 大小差异的解释是什么。由于这种尺寸变化,VS12 是否更安全或性能更好(寻找 "key point" 出售此开关)。

  2. 寻找减小二进制大小的方法,从容易实现的目标开始,到更精细的工作。

假设您正在 link静态访问 MFC:

解决方案

#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS

stdafx.h 的顶部,或将 _AFX_NO_MFC_CONTROLS_IN_DIALOGS 添加到项目设置中的预处理器定义中。

说明

MSVC 2010 包含大量新的扩展控件(其中大部分与功能区相关,但也有 CMFCButton 和其他内容。还有一个 MSVC 2008 的功能包)。这些新控件可以像旧的 Windows 控件一样通过资源编辑器添加到对话框中。

为了使这项工作正常进行,解析 RC 文件的代码1 需要知道所有新的 MFC 控件 类。如果您动态地 link MFC,这不是问题,但如果您静态地 link 它们,则意味着 MFC 的所有闪亮的新部分都已 link 编辑到您的应用程序中 无论你是否使用它们。 因此我有一个二元三元组的大小。

很快,事实证明这是一个比 Microsoft 人员想象的更严重的问题; link静态使用 MFC 显然比他们预期的更常见。解决 MSVC 2010 remains painful 中的问题,但在下一个版本中,引入了一种机制来禁用新功能:_AFX_NO_MFC_CONTROLS_IN_DIALOGS 预处理器宏。如果它是在任何包含 MFC headers 之前定义的,RC 解析器代码不会处理新控件,并且不会引入对它们的依赖性。请注意,这意味着无法通过资源编辑器将新控件添加到对话框中。

可以在 this MSDN blog post 中找到有关问题和解决方案的更详细的技术描述。

1是的,我在这里掩盖了一些细节。