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

时间:2011-03-02 13:46:36

标签: visual-studio-2010 size executable

我有一个最初用Visual Studio 6.0编写的C ++应用程序

该应用程序是标准的原始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,但确实如此。

5 个答案:

答案 0 :(得分:2)

尺寸的增加可能是由于MFC的变化造成的。 Here是一种解释,here是同一作者的一种解决方法,它将可执行文件的大小带回到2008年的区域。解决方法涉及编辑MFC源文件的副本,但是,过程并非每个人都满意,并且需要在每次更新后重复,例如安装Visual Studio Service Pack后。

更新

看起来OP不使用MFC,因此这些可能是两个不同的问题。我自己经历了尺寸增加,但不幸的是不能说是否由MFC引起,因为我的项目静态链接到MFC。

答案 1 :(得分:2)

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

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

如果要在Visual Studio IDE中构建,请通过从菜单中选择项目属性来检查链接器设置。在配置中,选择Release,然后单击左窗格中的链接器设置,这将显示与默认情况下当前设置的链接器设置相对应的配置列表。

在链接器下的命令行中,在Additional options条目中指定选项/ FILEALIGN:512,然后单击Apply按钮。在链接器下的“常规”选项中,通过选择“否”(/ INCREMENTAL:NO)禁用增量链接。在链接器的debugging选项中,为Generate Debug Info选择No.对于链接器优化,在“启用COMDAT折叠”中的“参考和删除冗余COMDAT(/ OPT:ICF)”中选择“消除未引用数据(/ OPT:REF)”。

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

不要忘记为您所做的每项更改单击“应用”按钮。

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

答案 2 :(得分:1)

您是否有机会将默认平台目标留在“任何CPU”?如果是这样,请将其更改为x86以获取仅32位代码。我猜这将弥补大部分差异。其余部分很可能是编译器优化的变化(更积极的循环展开以及因为RAM很便宜而无法在速度上交换大小的地方)。我相信所有细粒度优化仍然可以从命令行获得,但许多在UI选项面板中已经模糊不清。

答案 3 :(得分:1)

参见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上。

答案 4 :(得分:1)

这是因为在VS2010中,Microsoft在对话框窗口中添加了允许HTML组件的功能,因此即使您不使用它,也会引入并链接大量内容,优化和选项以及删除未引用的代码也无济于事。没有一种“好”的方式来删除代码,但有一些被黑客攻击的方式。因此,我们在VS2008上编译我们的大小关键的东西。注意,我们的非GUI代码实际上编译得更小,因为它的价值。希望MS在修复/补​​丁中提供一个选项,这样我就可以在VS2010上做所有事情,但我不会屏住呼吸......