我有一个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
) /GS-
并删除任何/RTC<x>
标志) 只要链接到kernel32.lib
和msvcrt.lib
,现在你的微小的可执行文件没有依赖关系。 (除非您计算操作系统。)
(nb:如果你希望能够优化大小( /O1
),你应该指定memset
作为用户定义的内在函数,详见本答案 。)
您可以尝试使用Dependency Walker来检查您的静态EXE文件所依赖的DLL,然后如果它依赖于某个库,则确定它存在于客户机器上,您可以在没有它的情况下进行编译并减小大小。