【问题标题】:Visual Studio 2013 creates larger exe's - no MFCVisual Studio 2013 创建更大的 exe - 没有 MFC
【发布时间】:2014-09-03 21:08:37
【问题描述】:

这个问题我有点晚了,但迟到总比没有好。自从 Visual Studio 6.0 发布以来,我一直在使用它,但最近在新 PC 上切换到 VS 2013。

我的项目要在 2013 年以下构建,但它生成的可执行文件始终比 VS6.0 生成的要大。我在这里看到了一个类似的线程,关于从 VS2008 到 VS2010 的过渡中发生的事情,并且那里的 cmets 和建议似乎都将更改归因于静态链接的 MFC 库中的更改。但是我的项目是直接的 C 代码.没有 C++,更不用说 MFC。并且我的项目上的“使用 MFC”选项设置为“使用标准 Windows 库”(可能是由生成 2013 兼容项目的导入工具设置的)。它使用的唯一非标准库是 wsock32.lib。

额外的大小并不是一个杀手,但它相对于整个应用程序的大小来说很重要。我最大的 .exe 从 980Kb 到 1.3Mb - 对于一个以小尺寸为卖点的应用程序来说,大小增加了大约 35%(即安装这个小应用程序,您就可以访问我们所有的好东西)。那是没有调试信息 - 调试版本的增加更多 - 但我并不关心。

任何想法如何去除新的杂物 - 甚至知道它是什么?

【问题讨论】:

  • 从历史上看,在一次调用中链接到“printf”用于引入大量静态库代码。我并不是说您的问题是 printf,但由于一些新功能(例如,自 VS6 以来已向 WinSock 添加了多少功能?),它可能是一些现在非常繁重的 lib 调用?另一种可能性是向编译器添加了安全功能从 VS6 开始的代码生成。
  • 即使您不愿意添加对单独安装 C++ 运行时 DLL 的依赖项,也请使用 /MD 进行构建,因为这可以很好地指示大小是多少归因于您的应用程序与库。
  • 您正在赶上 16 年的处理器开发和 C++ 代码优化器改进。更大的代码可以是更快的代码,由于更大的 CPU 缓存,内联和循环展开优化更加激进,自动矢量化和自动并行化不可避免地使用更复杂的指令。字节便宜了 100 倍,为 1.3 倍的大小增加而烦恼是毫无意义的。

标签: visual-c++ linker


【解决方案1】:

这是a good manual 如何使您的二进制文件更小。

基本思路如下:

  1. 别忘了发布模式
  2. 声明#define WIN32_LEAN_AND_MEAN
  3. 动态链接到 C++ 运行时
  4. 在没有调试信息的情况下编译可执行文件
  5. 使用 /O1 编译,一个“优化大小”标志
  6. 删除 iostream 和 fstream 标头,如果可能,请改用低级别

【讨论】:

  • #6 还给你一个巨大的速度提升作为奖励。
【解决方案2】:

通常您会在两个系统上生成一个MAP 文件,并找出导致最大贡献的部分。

Anton 的回答提醒了我:首先检查它们是否以相同的方式链接(都是静态的或都是动态的,否则是苹果和橘子)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2015-12-23
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多