C ++ / Win32最小的MessageBox(“你好”)app exe?

时间:2012-08-09 14:47:55

标签: c++ winapi optimization

我正在开发一个非常大的项目,我需要在每次新的构建时将exe上传到某人,并且我的连接是通过电话调制解调器。

我想为运行代码的应用程序编译尽可能小的exe:MessageBox(0, "Hello", 0, MB_OK);

我正在使用Visual Studio 2010.到目前为止我的尝试:

版本0,尺寸和开关:

  

7kB(释放)
  使用:\ O1

版本1,尺寸和开关:

  

3kB(释放)
  使用:\ O1,关闭缓冲区安全检查,忽略默认库链接。

这可以做到甚至小于3kB吗?什么编译器标志会影响可执行文件的大小?

4 个答案:

答案 0 :(得分:9)

动态链接CRT(即在代码生成选项中为CRT选择“多线程DLL”;应该是默认值)。选择尺寸优化。告诉链接器降低对齐要求(/ ALIGN和/OPT:NOWIN98,可以在项目配置对话框中的链接器选项下的命令行选项框中输入)(注意:这可能导致您的应用程序无法运行Windows版本。)

除此之外,您还可以使用打包程序,例如UPX,但请记住,如果某些防病毒工具无法成功分析其内容,则会错误地将打包的可执行文件检测为恶意软件。其他可用于Windows可执行文件的打包程序包括Crinklerkkrunchy

即使没有打包器,您也可以做一些技巧,比如合并PE部分并将代码放在PE头中。通过这样做,您可以获得一个简单的“Hello world”MessageBox可执行文件,大约700字节左右(未压缩)。我不认为Visual C ++链接器支持这些操作。请参阅Tiny PE页面,了解如何手动完成此操作(他将其发挥到极致)。

答案 1 :(得分:3)

创建一个新的C ++ Win32项目,并选择空项目选项。

添加一个文件main.cpp,其中包含以下内容:

#include <Windows.h>

void HelloWorldMain()
{
    MessageBox(0, L"Hello", 0, MB_OK);
}

在项目属性中,关闭缓冲区安全检查(C ++&gt;代码生成),忽略所有默认库(链接器&gt;输入),并将入口点(链接器&gt;高级)设置为HelloWorldMain。

构建发布配置;输出exe将是3K。

答案 2 :(得分:3)

#undef UNICODE
#define UNICODE
#include <windows.h>

void startup()
{
    MessageBox( 0, L"Hello", L"Hi", MB_SETFOREGROUND );
    ExitProcess( 0 );
}


[d:\dev\test]
> cl foo.cpp kernel32.lib user32.lib /O2 /link /entry:startup /subsystem:windows
foo.cpp

[d:\dev\test]
> dir foo.exe
 Volume in drive D is data
 Volume Serial Number is A875-F9FD

 Directory of d:\dev\test

09.08.2012  18:00             2 560 foo.exe
               1 File(s)          2 560 bytes
               0 Dir(s)  144 102 051 840 bytes free

[d:\dev\test]
> _

答案 3 :(得分:-3)

类似的东西:

#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
     MessageBox (NULL, "Hello, Windows 98!", "HelloMsg", MB_OK) ;

     return 0 ;
}