减少Windows可执行文件的大小

时间:2009-01-13 01:28:30

标签: c++ windows dll mfc linker

我在Windows上有一个C ++ / MFC应用程序 - 动态链接它只有60kb静态它是> 3MB。
它是通过电子邮件分发给客户的,因此需要尽可能小。

它静态链接MFC和MSCVRT库 - 因为它修复了一些问题,我不想要更多关于缺少库的支持调用 - 特别是非常有用的“应用程序配置不正确”一个!

有没有办法删除所有额外的MFC东西的Windows exe,这是dll但是我没有使用?
或者告诉它动态链接MSVCRT(必须存在)但静态链接可能不是的MFC dll?

编辑 - 感谢将其降至1.6Mb,这将是必须的!

4 个答案:

答案 0 :(得分:7)

你不能混合使用CRT / MFC dll。从记忆中走出来......

正如其他答案所示,您可以#define WIN32_LEAN_AND_MEAN和VC_EXTRALEAN。这些可能无济于事。它们倾向于最小化构建时间 - 而不是最终的exe大小。

没有重建MFC(这是一个选项 - 你可以重建它/ Os,或者如果你感觉非常厚颜无耻,/ GL - 但这可能会带来更多的下游乐趣 - 希望它已经建成/ Gy)。< / p>

行。简单的事情要尝试。使用/ GL / Os / GF / Gy / GA构建您的应用程序。在链接器中,您或多或少需要/ OPT:REF和/ OPT:ICF和/ LTCG。

我不得不说 - 从30k到兆字节的版本构建有点多。你也可以传递/映射到链接器,看看是什么占据了所有空间 - 但这是非常非常的。

听起来好像MFC不是用/ Gy构建的 - 但这会令人惊讶。

答案 1 :(得分:7)

我不确定如何剥离可执行文件,但另一个想法是压缩它,例如使用upx,它将解压缩它并在适当的位置运行...这是否会减小足够的大小你?

答案 2 :(得分:4)

对于使用CRT的程序,您可以使用this video by Per Vognsen中的技术来实现3.5KB可执行文件。自{95}以来每个Windows都附带Windows\System32\msvcrt.dll,因此通过链接到那个,您无需将Visual C ++ Redistributable与您的应用程序打包在一起。

基本过程是:

  1. dumpbin上运行Visual Studio的System32\msvcrt.dll并将其传输到文件
  2. 运行简单过滤器(awk '{print $4}')以创建msvcrt.def文件
  3. lib上运行VS的msvcrt.def以生成msvcrt.lib
  4. 禁用项目中的默认库(/NODEFAULTLIB命令行上的link
  5. 禁用某些Visual C ++检查(/GS-并删除所有/RTC<x>标志)
  6. 链接kernel32.libmsvcrt.lib并且瞧,您的微型可执行文件除了操作系统之外没有任何依赖关系。

    (n.b。:要优化尺寸(/O1),请将memset指定为内在的here。)

答案 3 :(得分:1)

您可以尝试Dependency Walker来检查您的静态EXE文件所依赖的DLL,然后如果它依赖于您确定它存在于客户端计算机上的库,则可以在没有它的情况下进行编译并减小其大小。