【问题标题】:Reduce windows executable size减小 Windows 可执行文件大小
【发布时间】:2010-10-01 01:30:01
【问题描述】:

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

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

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

编辑 - 感谢您将它降低到 1.6Mb,这是必须要做的!

【问题讨论】:

    标签: c++ windows dll mfc linker


    【解决方案1】:

    您不能混合使用 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 到 MB 的发布版本有点多。您还可以将 /map: 传递给链接器,看看是什么占用了所有空间 - 但这非常乏味。

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

    【讨论】:

      【解决方案2】:

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

      基本流程是:

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

      链接到kernel32.libmsvcrt.lib,瞧,你的微型可执行文件除了操作系统之外零依赖。

      (n.b.:要优化大小 (/O1),请将 memset 指定为内部函数,详细说明 here。)

      【讨论】:

        【解决方案3】:

        我不知道如何剥离可执行文件,但另一个想法是压缩它,例如使用upx,它将解压缩并在原地运行它......这对你来说是否减小了足够的大小?

        【讨论】:

        • UPX 非常好,我的一个应用在 upx 之前是 6mb,在 upx 之后是 2mb!
        • 看起来很棒的工具,但不适用于 .NET 文件 (C++ CLR)。当我尝试在我的 exe 上运行时抛出 CantPackException: .NET files are not yet supported
        • @kiner_shah - 是的,此页面上列出的解决方案都是针对 MFC 应用程序,而不是 .NET 应用程序。
        • 我将它用于另一个 exe。工作得很好,从 23 MB 减少到 7 MB。 :-)
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2010-09-17
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多