减少Windows可执行文件的大小

Mar*_*ett 5 c++ windows dll linker mfc

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

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

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

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

Joe*_*Joe 7

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

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

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

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

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

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


Sto*_*bor 7

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

  • UPX很棒,我的应用程序之一是6mb之前和2mb之后upx! (2认同)

pmt*_*ara 7

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

基本流程是:

  1. 运行Visual Studio的dumpbinSystem32\msvcrt.dll和管道到一个文件
  2. 运行一个简单的过滤器 ( awk '{print $4}') 来创建一个msvcrt.def文件
  3. 运行VS是libmsvcrt.def生成msvcrt.lib
  4. 禁用项目中的默认库(/NODEFAULTLIBlink命令行上)
  5. 禁用一些 Visual C++ 检查(/GS-并删除所有/RTC<x>标志)

链接kernel32.libmsvcrt.lib和瞧,您的小可执行文件除了操作系统之外还具有零依赖性。

(注意:要针对大小 ( /O1)进行优化,请memset按照此处的详细说明指定为内在函数。)