C++ 减少windows可执行文件的大小

C++ 减少windows可执行文件的大小,c++,windows,dll,mfc,linker,C++,Windows,Dll,Mfc,Linker,我在windows上有一个C++/MFC应用程序-动态链接,它只有60kb的静态空间,大于3Mb。 它是一个通过电子邮件分发给客户的系统,因此需要尽可能小 它静态链接MFC和MSCVRT库-因为它修复了一些问题,而且我不希望更多关于缺少libs的支持调用-尤其是非常有用的“应用程序配置不正确”一词 是否有任何方法可以去除Windows exe中所有额外的MFC内容,这些内容是dll,但我不使用它们? 或者告诉它动态链接MSVCRT(必须存在),但静态链接可能不存在的MFC dll 编辑-感谢您将

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

它静态链接MFC和MSCVRT库-因为它修复了一些问题,而且我不希望更多关于缺少libs的支持调用-尤其是非常有用的“应用程序配置不正确”一词

是否有任何方法可以去除Windows exe中所有额外的MFC内容,这些内容是dll,但我不使用它们?
或者告诉它动态链接MSVCRT(必须存在),但静态链接可能不存在的MFC dll


编辑-感谢您将其降至1.6Mb,这将不得不做

不能混合使用CRT/MFC DLL。从记忆中

正如另一个答案所建议的,你可以定义WIN32精益和VC超精益。但这些可能不会有帮助。他们倾向于最小化构建时间,而不是最终的exe大小

除了重建MFC(这是一个选项-您可以重建它/Os,或者如果您觉得非常无礼,/GL-但这可能会带来更多的下游乐趣-希望它已经构建/Gy)

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

我不得不说,从30k到兆字节的发布版本有点太多了。您还可以将:传递/映射到链接器,并查看是什么占用了所有空间-但这是非常非常非常的tedius


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

我不知道如何剥离可执行文件,但另一个想法是压缩它,例如使用,它将解压缩并在适当的位置运行它。。。这是否减少了足够的大小?

您可以尝试检查静态EXE文件所依赖的DLL,然后如果它依赖于一个库,您确信它存在于您的客户机上,您可以不使用它进行编译并减小大小。

对于使用CRT的程序,您可以使用中的技术来实现3.5KB的可执行文件<代码> Windows \ Stase32 \MsCRCR.DLL< /COD> 95以来,每个窗口都有船,所以通过链接,您不需要用应用程序包包VisualC++重新分配。 基本过程是:

  • System32\msvcrt.dll
    上运行Visual Studio的
    dumpbin
    ,并将其传输到文件中
  • 运行一个简单的过滤器(
    awk'{print$4}'
    )来创建一个
    msvcrt.def
    文件
  • msvcrt.def
    上运行VS的
    lib
    生成
    msvcrt.lib
  • 禁用项目中的默认库(
    链接上的
    /NODEFAULTLIB
  • 禁用一些VisualC++检查(<代码> /GS -<代码>,删除任何<代码> /RTC < /COD>标志> 链接到
    kernel32.lib
    msvcrt.lib
    ,瞧,除了操作系统之外,您的小可执行文件没有任何依赖性


    (注意:要优化大小(
    /O1
    ),请将
    memset
    指定为详细说明的内在属性。)

    UPX非常出色,我的一个应用程序在UPX之前为6mb,之后为2mb!这似乎是一个很棒的工具,但不适用于.NET文件(C++CLR)。抛出
    CantPackException:.NET文件在我尝试在我的exe上运行时还不受支持。@kiner_shah-是的,此页上列出的解决方案都是针对MFC应用程序的,而不是.NET应用程序。我将其用于另一个exe。工作非常好,从23MB减少到7MB.:-)