2011-12-31 68 views
2

球員我想開始使用C++進行編程。我在vb6,vb.net寫了一些程序,現在我想用C++來獲得知識,我想要的是一個編譯器,它可以將我的代碼編譯到最小的windows應用程序。例如,有一種稱爲PureBasic的Basic語言編譯器,可以使Hello World獨立應用程序的大小爲5 kb,並且我編譯的簡單套接字程序僅爲12kb(沒有任何DLL-s和Runtime文件)。我知道這是驚人的,所以我想爲C++這樣的東西。用於最小可執行文件的C++ Windows編譯器

如果我錯了,也沒有這樣的Windows編譯器有人可以給我一個網站或書,可以教我如何減少C++可執行文件大小,或如何使用Windows API調用?

+10

從學習C++開始,然後擔心EXE大小。如果你沒有花時間去學習核心原則,你會遇到各種各樣的麻煩。 – Matt 2011-12-31 15:39:54

+0

看看http://www.codeproject.com/KB/library/tlibc.aspx – dalle 2011-12-31 15:41:17

+1

通常可執行的大小不是一個問題。另外,請注意,儘管您聲明應用程序沒有運行時或dll,但這並不準確。更重要的是這些運行時是否是系統的標準。 – Serodis 2011-12-31 15:41:41

回答

3

多年前我不得不用VC6來做這件事。這是必要的,因爲可執行文件將通過網絡傳輸到目標計算機,並在該計算機上運行。由於它可能通過調制解調器連接發送,因此它需要儘可能小。爲了縮小可執行文件,我依靠兩種技術:

  1. 請勿使用C或C++運行庫。告訴編譯器不要將它們鏈接起來。使用Windows API的一個子集實現所有必要的功能,該API的保證在當時所有版本的Windows上都可用(98,Me,NT,2000)。
  2. 告訴鏈接器將所有代碼和數據段合併成一個。我不記得這個開關,我不知道它是否仍然有可能,特別是對於64位可執行文件。

最終可執行文件的大小:〜2K

5

例如Microsoft Visual C++編譯器...您只需關閉鏈接到C運行庫(/NODEFAULTLIB),並且您的可執行文件將小至5KB。只有一個問題:幾乎不能使用標準C和C++庫中的任何內容,也不能使用C++的標準功能,如異常處理,運算符newdelete,浮點運算等等。您只需要使用純操作系統功能(例如,使用CreateFile創建文件,使用HeapAlloc分配內存等)。

+0

要公平,您可以使用操作系統函數 – Milan 2011-12-31 16:15:53

+0

@ entity64編寫自己的新/刪除操作符:是的,您也可以從頭開始實現您需要的CRT部分。 – ybungalobill 2011-12-31 17:07:50

0

我不知道爲什麼你是學習語言之前感興趣的這種優化的,但反正...

它不會使你用什麼編譯太大的區別,但你怎麼用它。例如,選擇一個像Visual Studio C++或MinGW這樣的編譯器,並閱讀它的文檔。您將找到關於如何優化編譯大小或性能的信息(通常在優化大小時會損失性能,反之亦然)。

例如,在Visual Studio中,通過將/ O1參數傳遞給編譯器(或項目屬性/ C-C++/Optimization),可以最大限度地減小可執行文件的大小。

另外不要忘記在「發佈」模式下編譯,或者您的可執行文件可能會充滿調試符號,這將增加可執行文件的大小。

+0

感謝您的好答案,但我認爲如果一小部分人做出了基本語言編譯器,該編譯器會生成可擴展的小型exe文件,那麼對於C++應該有類似的東西,我認爲我錯了 – Irakli 2011-12-31 16:02:09

0

運行Windows的現代桌面PC至少有1G內存和巨大的硬盤,擔心一個無法代表任何實際應用程序的普通程序的大小是毫無意義的。

任何語言的「Hello world」程序的大部分大小都是固定的開銷,與建立執行環境和加載並啓動代碼有關。對於任何非平凡的應用程序,您應該更關心代碼大小隨着添加更多功能而增加的速率。從這個意義上說,任何編譯器中的C++代碼都非常有效。也就是說,你的PureBasic程序幾乎沒有或者沒有什麼可能比同等的C++程序小,但是當你在代碼中構建有用的功能時並不一定如此。如果printf()(或cout <)的代碼是靜態鏈接的,則生成的可執行文件可能會更大,因爲printf()具有很多功能,它們是沒有用在「hello world」程序中,因此是多餘的。例如嘗試使用puts(),您可能會發現代碼較小。

此外,你確定你是蘋果比較蘋果?某些執行環境依賴於動態鏈接的運行時庫或虛擬機,該虛擬機提供的功能可能在C++程序中靜態鏈接。

-1

我不喜歡回覆死職位,但因爲沒有響應的提到了這一點(除了墊響應)...

重複在我之後:C++!=(vb6 || vb.net || basic)。我不僅僅提到語法,C++編碼風格通常與VB中的編程風格不同,因爲C++程序員試圖使事情通常比vb程序員設計得更好......

PS:不,不存在在C++世界中複製粘貼。對不起,不得不說,這...

相關問題