我必须维护包含多个项目的大型旧代码库(不是我自己编写的),其中大多数都是C++。我的第一步是将代码库从VS 2008升级到VS 2013。
两种解决方案都针对大小进行了优化(在发行版本中)。但是,二进制文件的大小现在几乎在所有二进制文件中都增加了约30%-我很难解释。
这些项目大量使用了ATL,而且我知道ATL 9已移至静态库,但是我怀疑这能否解释所有的大小差异。
任何想法:
最佳答案
假定您静态链接MFC:
解决方案
放
#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS
在stdafx.h
的顶部,或将_AFX_NO_MFC_CONTROLS_IN_DIALOGS
添加到项目设置中的预处理器定义。解释
MSVC 2010包含大量新的扩展控件(大多数控件与功能区相关,但还与
CMFCButton
等有关。MSVC2008还具有一个功能部件包)。可以像以前的Windows控件一样,通过资源编辑器将这些新控件添加到对话框中。为了使此工作,解析RC文件1的代码需要知道所有新的MFC控件类。如果动态链接MFC,这不是问题,但是如果静态链接它们,则意味着无论是否使用它们,MFC的所有 Shiny 的新部分都链接到应用程序中。 因为这个原因,我的二进制大小为三倍。
很快,这变成了比Microsoft员工想象的更大的问题。静态链接MFC显然比他们预期的要普遍。解决了MSVC 2010 remains painful中的问题,但在下一版本中,引入了一种机制来禁用新功能:
_AFX_NO_MFC_CONTROLS_IN_DIALOGS
预处理程序宏。如果在任何包含MFC头之前定义了它,则RC解析器代码将不处理新控件,并且不会引入对它们的依赖关系。请注意,这意味着无法通过资源编辑器将新控件添加到对话框中。有关问题和解决方案的更详细的技术说明,可以在this MSDN blog post中找到。
1是的,我在这里详细介绍一些细节。