减lessWindows可执行文件的大小

我有一个Windows上的C + + / MFC应用程序 – dynamic链接它只有60kb静态它是> 3Mb。
这是一个通过电子邮件分发给客户,所以需要尽可能小。

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

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

编辑 – 感谢,把它降到1.6Mb,将不得不做!

你不能混合CRT / MFC DLL。 从记忆中…

正如其他答案所建议的那样,您可以#定义WIN32_LEAN_AND_MEAN和VC_EXTRALEAN。 这些可能不会帮助。 他们倾向于最小化构建时间 – 而不是最终的EXE大小。

短缺的重建MFC(这是一个选项 – 你可以重建它/ OS,或者如果你真的感觉厚脸皮,/ GL – 但这可能会导致更多的下游乐趣 – 希望它已经建成/ Gy)。

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

我不得不说 – 从30k到兆字节的发布版本有点多。 你也可以通过/映射:链接器,看看什么是所有的空间 – 但这是非常非常tedius。

这几乎听起来像MFC不是用/ Gy构建的 – 但是这将是令人惊讶的。

我不知道如何去除可执行文件,但另一个想法是压缩它,例如使用upx ,它将解压缩并将其运行到适当的位置…这是否会减小足够的大小?

对于使用CRT的程序,您可以使用Per Vognsen在本视频中的技术,详细说明如何通过链接到自Windows 95以后的每个Windows附带的Windows\System32\msvcrt.dll来实现3.5kb可执行文件,因此您不需要将Visual C ++ Redistributable与您的应用程序一起打包。

这个过程是这样的:

  • 在您的System32\msvcrt.dll上运行Visual Studio的dumpbin ,并将其传递给一个文件
  • 做一些简单的过滤( awk '{print $4}' )来创建一个msvcrt.def文件
  • msvcrt.def上运行VS的lib来生成一个“自定义”的msvcrt.lib
  • 禁用项目链接器设置中的所有默认库(命令行中的/NODEFAULTLIB
  • 在项目设置中禁用一些Visual C ++检查( /GS-并删除任何/RTC<x>标志)

只要链接到kernel32.libmsvcrt.lib ,现在你的微小的可执行文件没有依赖关系。 (除非您计算操作系统。)

(nb:如果你希望能够优化大小( /O1 ),你应该指定memset作为用户定义的内在函数,详见本答案 。)

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