0

I am working on a project that is getting really large and I need to have the exe uploaded to someone every time a new build is out, and my connection is by phone modem.

I want to compile the smallest possible exe for an application whose purpose is to run the code: MessageBox(0, "Hello", 0, MB_OK);

I am using Visual Studio 2010. My attempts so far:

Version 0, size and switches:

7kB (release)
Used: \O1

Version 1, size and switches:

3kB (release)
Used: \O1, Off buffer security check, Ignore default library linkage.

Can this be made even smaller than 3kB? What compiler flags influence the size of the executable?

4

4 回答 4

9

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

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

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

于 2012-08-09T14:56:54.503 回答
3

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

添加一个文件 main.cpp,其内容如下:

#include <Windows.h>

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

在项目属性中,关闭 Buffer Security Check(C++ > Code Generation),Ignore All Default Libraries(Linker > Input),并将Entry Point(Linker > Advanced)设置为HelloWorldMain。

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

于 2012-08-09T14:59:17.720 回答
3
#undef UNICODE
#define UNICODE
#include <windows.h>

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

[d:\开发\测试]
> cl foo.cpp kernel32.lib user32.lib /O2 /link /entry:startup /subsystem:windows
foo.cpp

[d:\开发\测试]
> 目录 foo.exe
 驱动器 D 中的卷是数据
 卷序列号为 A875-F9FD

 d:\dev\test 目录

09.08.2012 18:00 2 560 foo.exe
               1 文件 2 560 字节
               0 Dir(s) 144 102 051 840 字节空闲

[d:\开发\测试]
> _
于 2012-08-09T16:03:20.323 回答
-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 ;
}
于 2012-08-09T14:52:39.367 回答