2014-09-03 46 views
3

我有点迟到这个问题,但迟到比从来没有更好。自推出以来,我一直使用Visual Studio 6.0,但最近在新PC上切换到VS 2013。Visual Studio 2013创建更大的EXE的 - 没有MFC

我已经让自己的项目在2013年建成,但生成的可执行文件始终比生成的VS6.0大。我在这里看到过类似的线索,关于从VS2008到VS2010的转换过程中出现的情况,以及这里的意见和建议似乎都将变化归因于静态链接的MFC库中的更改。但是,我的项目是直接C代码。没有C++,更不用说MFC了。并且我的项目中“使用MFC”选项设置为“使用标准Windows库”(大概由生成2013兼容项目的导入工具设置)。唯一使用的非stadard库是wsock32.lib。

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

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

+0

从历史上看,将一次调用链接到“printf”用于引入大量静态lib代码。我并不是说你的问题是printf,但它可能是一些lib调用,由于某些新功能,现在很重(例如,自VS6以来,有多少功能已添加到WinSock中?)另一种可能性是添加到编译器的安全性功能code-gen自VS6以来。 – franji1 2014-09-04 04:35:36

+0

即使您不愿意在单独安装的C++运行时DLL上添加依赖项,也可以使用'/ MD'进行生成,因为这样可以很好地说明应用程序与库的大小有多大关系。 – 2014-09-06 01:41:22

+0

您正在追赶16年的处理器开发和C++代码优化器的改进。更大的代码*可以更快的代码,内联和循环展开优化由于更大的CPU高速缓存,自动矢量化和自动并行化,不可避免地使用更复杂的指令。字节的价格便宜了100倍,在1.3倍的尺寸上增加了无用的烦恼。 – 2014-09-06 11:36:25

回答

1

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

安东的回答让我想起:首先检查他们是否都连接相同的方式(静态或动态两种,否则它是苹果和桔子)

1

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

基本思路如下:

  1. 不要忘记释放模式
  2. 声明#define WIN32_LEAN_AND_MEAN
  3. 动态链接到C++运行时
  4. 编译可执行文件没有调试信息
  5. 编译与/ O1,'优化大小'标志
  6. 删除iostream和fstream标头,我们e如果可能的话,改为低级别
+0

#6也给你一个巨大的速度提升作为奖励。 – 2014-09-06 01:38:47