我在Windows上有一个C ++ / MFC应用程序 - 动态链接它只有60kb静态它是> 3MB。
它是通过电子邮件分发给客户的,因此需要尽可能小。
它静态链接MFC和MSCVRT库 - 因为它修复了一些问题,我不想要更多关于缺少库的支持调用 - 特别是非常有用的“应用程序配置不正确”一个!
有没有办法删除所有额外的MFC东西的Windows exe,这是dll但是我没有使用?
或者告诉它动态链接MSVCRT(必须存在)但静态链接可能不是的MFC dll?
编辑 - 感谢将其降至1.6Mb,这将是必须的!
答案 0 :(得分:7)
你不能混合使用CRT / MFC dll。从记忆中走出来......
正如其他答案所示,您可以#define WIN32_LEAN_AND_MEAN和VC_EXTRALEAN。这些可能无济于事。它们倾向于最小化构建时间 - 而不是最终的exe大小。
没有重建MFC(这是一个选项 - 你可以重建它/ Os,或者如果你感觉非常厚颜无耻,/ GL - 但这可能会带来更多的下游乐趣 - 希望它已经建成/ Gy)。< / p>
行。简单的事情要尝试。使用/ GL / Os / GF / Gy / GA构建您的应用程序。在链接器中,您或多或少需要/ OPT:REF和/ OPT:ICF和/ LTCG。
我不得不说 - 从30k到兆字节的版本构建有点多。你也可以传递/映射到链接器,看看是什么占据了所有空间 - 但这是非常非常的。
听起来好像MFC不是用/ Gy构建的 - 但这会令人惊讶。
答案 1 :(得分:7)
我不确定如何剥离可执行文件,但另一个想法是压缩它,例如使用upx,它将解压缩它并在适当的位置运行...这是否会减小足够的大小你?
答案 2 :(得分:4)
对于使用CRT的程序,您可以使用this video by Per Vognsen中的技术来实现3.5KB可执行文件。自{95}以来每个Windows都附带Windows\System32\msvcrt.dll
,因此通过链接到那个,您无需将Visual C ++ Redistributable与您的应用程序打包在一起。
基本过程是:
dumpbin
上运行Visual Studio的System32\msvcrt.dll
并将其传输到文件awk '{print $4}'
)以创建msvcrt.def
文件lib
上运行VS的msvcrt.def
以生成msvcrt.lib
/NODEFAULTLIB
命令行上的link
)/GS-
并删除所有/RTC<x>
标志)链接kernel32.lib
和msvcrt.lib
并且瞧,您的微型可执行文件除了操作系统之外没有任何依赖关系。
(n.b。:要优化尺寸(/O1
),请将memset
指定为内在的here。)
答案 3 :(得分:1)
您可以尝试Dependency Walker来检查您的静态EXE文件所依赖的DLL,然后如果它依赖于您确定它存在于客户端计算机上的库,则可以在没有它的情况下进行编译并减小其大小。