我必须维护包含多个项目的大型旧代码库(不是我自己编写的),其中大多数都是C++。我的第一步是将代码库从VS 2008升级到VS 2013。

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

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

任何想法:

  • 关于大小差异的解释是什么。 VS12是否由于此尺寸更改而更安全或更具有更好的性能(寻找“关键点”以出售此交换机)?
  • 寻找降低二进制文件大小的方法,从低挂的水果开始,以进行更复杂的工作。
  • 最佳答案

    假定您静态链接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是的,我在这里详细介绍一些细节。

    08-27 19:57
    查看更多