2012-08-09 84 views
-1

我正在研究一个变得非常大的项目,每当新版本出来时我都需要将exe上传到某人,而我的连接是通过电话调制解调器。C++/Win32尽可能最小的MessageBox(“Hello”)应用程序exe?

我想编译应用程序,其目的是要运行的代码尽可能小的EXE:MessageBox(0, "Hello", 0, MB_OK);

我使用Visual Studio 2010中我尝试至今:

版本0,大小和开关:

7KB(释放)
使用:\ O1

1版,尺寸和开关:

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

这可以做得甚至小于3kB吗?哪些编译器标志影响可执行文件的大小?

+1

什么是你的问题? – egrunin 2012-08-09 14:51:15

+0

可能是编译器标志。 – nhahtdh 2012-08-09 14:51:59

+0

我应该使用哪些编译器标志?包含哪些标题?什么是VC项目设置?其他程序,可以压缩EXE大小? – user1581390 2012-08-09 14:56:29

回答

-2

类似:动态

#include <windows.h> 

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

    return 0 ; 
} 
+0

如果使用[/ O1标志](http://msdn.microsoft.com/zh-cn/library/8f8h5cxt.aspx)进行编译,也可能会减小大小。 – 2012-08-09 14:53:17

+0

添加缺少的报价。 – egrunin 2012-08-09 14:56:30

+0

如何在VC 2010项目设置/属性中设置/ O1? – user1581390 2012-08-09 14:58:31

9

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

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

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

+0

我认为你需要把/ MD链接到动态库,如果从命令行编译。 – jcoder 2012-08-09 14:58:28

+0

@JohnB:是的,那可能是真的。在使用Microsoft的编译器时,我只通过IDE构建东西。 – Michael 2012-08-09 15:00:21

+0

动态链接CRT?什么是CRT?选择尺寸优化:完成。/ALIGN和/ OPT:NOWIN98?哪里在VC 2010?哪个封隔器最好?我如何合并PE部分? – user1581390 2012-08-09 15:01:56

3

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

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

#include <Windows.h> 

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

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

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

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] 
> _