6

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

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

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

编辑 - 谢谢你把它降到了 1.6Mb,这是必须的!

4

4 回答 4

10

您不能混合 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 构建的——但这会令人惊讶。

于 2009-01-13T01:44:18.707 回答
10

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

The basic process is:

  1. Run Visual Studio's dumpbin on System32\msvcrt.dll and pipe it to a file
  2. Run a simple filter (awk '{print $4}') to create a msvcrt.def file
  3. Run VS's lib on msvcrt.def to generate msvcrt.lib
  4. Disable default libraries in your project (/NODEFAULTLIB on the link command line)
  5. Disable some Visual C++ checks (/GS- and remove any /RTC<x> flags)

Link against kernel32.lib and msvcrt.lib and voilà, your tiny executable has zero dependencies besides the OS.

(n.b.: To optimize for size (/O1), specify memset as an intrinsic as detailed here.)

于 2016-09-28T03:50:53.347 回答
9

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

于 2009-01-13T01:46:47.420 回答
1

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

于 2009-01-13T05:16:15.407 回答