Visual Studio 2010中生成的可执行文件大小

问题描述:

我有原来写的Visual Studio的C++应用程序6.0Visual Studio 2010中生成的可执行文件大小

该应用程序是标准和原材料的Win32 API,没有MFC(*编辑2),没有.NET,静态链接,多线程可执行文件。

我已经通过Visual Studio的所有版本迁移到2010年(今天),从未发生过任何问题,到现在为止:

它编译与VS2010但是生成的可执行文件的大小运行完全是四(4)次更大!

我试过了我所知道的所有选项(优化,删除调试信息等),但没有结果。当然,我是VS2010的新手,但不是Visual Studio。

有没有人遇到过这个问题?再次:我没有使用任何框架,它是一个原始的,静态链接的Win32应用程序,没有DLL,没有ODBC,没有网络,没有.NET。输入。

  • 编辑1: 原始大小= 626KB(VS6.0,VS2008) 体积臃肿= 2.013KB(VS2010)

  • 编辑2: 经过一番研究和垃圾场,我发现了一个隐藏参考MFC。 最初我说过它没有使用MFC,但它确实如此。

+1

这也许无论是静态链接或者一个连接设置在VS2010改为默认生成更好的缓存或某个更大的部分。我们在这里谈论的是什么数量级 - 4K到16K? 64K到256K? 1MB到4MB? – Rup 2011-03-02 13:50:08

+0

什么是平均4倍?兆字节?五兆字节? – 2011-03-02 13:50:11

+0

我编辑了问题以包含样本大小,这发生在我所有的应用程序中。 – Migs 2011-03-02 13:58:51

大小的增加可能是由MFC的更改引起的。 Here是一个解释,而here是同一作者的一种解决方法,它将可执行文件的大小降低到与2008年相同的区域。该解决方法涉及编辑MFC源文件的副本,但不是每个人都可能会感到满意的一个过程,并且需要在每次更新后重复,例如安装Visual Studio服务包后。

更新:

它看起来像OP不使用MFC,所以这可能是两个不同的问题。我已经体验到了自己的大小增加,但不幸的是无法说是否由MFC引起,因为我的项目静态链接到MFC。

+0

这非常整洁,虽然我不明白为什么你想静态链接,而不是动态链接,尽管现在MFC住在WinSxS中。 OP说他不使用MFC。 – Rup 2011-04-04 10:29:27

+0

您希望在编写命令行工具时将其静态链接,该工具要作为EXE分发,而无需安装程序和MFC运行时。 – 2011-04-04 12:44:14

你有没有机会将默认平台目标放在“任何CPU”?如果是这样,请将其更改为x86,仅限32位代码。我猜测这将弥补大部分差异。其余的可能是编译器优化方面的变化(更积极的循环展开,以及因为RAM便宜而以速度交易的尺寸)。我相信所有粒度优化仍然可以从命令行获得,但很多已经在UI选项面板中被遮盖了。

+2

此设置适用于。NET项目,而不是问题的情况下(本地编译) – CharlesB 2011-03-06 20:10:47

+0

不,我也试过。这个问题肯定是我上面评论的90%:在迁移这个项目的时候,MFC重新开始了,但现在我没有时间去检查它到底是什么。只要有空闲时间,我会检查并发布最终结论。 – Migs 2011-03-08 21:31:57

请参阅Are there any tools for tracking down bloat in C++? - 这里描述了一些如何分析对可执行文件大小做出贡献的技术。一旦你对VC 6和VS 2010输出进行分析,希望你会发现一些有用的东西。

当从VC 6移植到某些Visual Studio版本时,有一个特殊的问题已经触及我:某些优化选项的含义已更改,我在VC 6项目中使用的值不再受支持,并且作为导致由VS产生的exe根本没有被优化,导致可执行性膨胀和性能下降。检查Properties/C/C++/Optimization中的优化设置,并确保优化处于/ Ox,/ O2或/ O1。

这是因为在VS2010中微软添加了允许HTML组件在对话框窗口中的功能,所以即使不使用它,优化和选项以及删除未引用的代码也无济于事。没有一种“好”的方式来删除代码,但有一些被黑掉的方法。我们在VS2008上编译我们的尺寸至关重要的东西仍然是因为这个原因。值得一提的是,我们的非GUI代码实际上编译的是更小的值。希望MS出现在修复/补​​丁这个选项,所以我可以做一切VS2010,但我不会屏住了呼吸......

如果使用的是静态链接,我建议使用链接器开关,如果您正在命令行使用语法编译:

cl/Ox [您的C++源文件] [需要的库文件] [需要的资源文件]/link/FILEALIGN:512/OPT:REF/OPT:ICF /增量:NO

如果您在Visual Studio IDE内构建,您可以通过从菜单中选择项目属性检查连接设置。在配置中,选择Release,然后单击左侧窗格中的链接器设置,这将显示与默认当前设置的链接器设置对应的配置列表。在其他选项512项,然后点击应用按钮:

在链接器在命令行下,指定选项/ FILEALIGN。在链接器下的常规选项中,通过选择否(/ INCREMENTAL:NO)禁用增量链接。在链接器的调试选项中,选择否用于生成调试信息。对于链接器优化,您可以在启用COMDAT折叠中的引用和删除冗余COMDAT(/ OPT:ICF)中选择消除未引用数据(/ OPT:REF)。

对于编译器的优化,确保释放配置中选择,单击左窗格中下的C/C++树视图中单击优化,选择全优化(/ OX)。在C/C++下的常规设置中,为调试信息格式选择已禁用。

不要忘记点击你尽一切变化Apply按钮。

我希望在这里提到的所有内容都对您有所帮助,所有这些都适用于Visual C++ 2005和2008,但希望它也适用于Visual C++ 2010,如果不适用,请检查随附的文档Visual C++ 2010安装。