2012-08-09 70 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] 
> _