簡體   English   中英

編譯差異:Windows與Linux

[英]Compilation Difference: Windows vs. Linux

我有一個用C編寫的程序,可以在Windows 7筆記本電腦和Ubuntu虛擬機上進行編譯。 我使用的編譯器是GCC,但是在Windows 7上,我下載了MinGW。

編譯完程序后,我檢查了它們的文件大小,並注意到Windows上的.exe遠遠大於Ubuntu上的.exe

對於Windows,我的文件大小為69,280字節,但是在Ubuntu上,我的文件大小僅為8,703字節。

這里發生了什么?

無論您使用的是哪個本機運行時(MinGW或mingw-w64),都會遇到這種膨脹。 這是因為Windows可執行文件鏈接到靜態庫,而Ubuntu上的GCC鏈接到共享庫(如果您是Windows .so則為.dll文件;如果您是* nix .dylib則為.so文件;如果您是* nix .dylib則為.dylib 。是OS X人員)。

我剛剛用一個很小的C程序(即使沒有任何標頭也測試了Cygwin64 vs. mingw-w64),因為有些標頭可能會用自己的調用函數的宏替換您的函數調用),包括調試信息,並且沒有優化,Cygwin隨文件大小獲勝者為67024字節和132206字節。 通過優化文件大小並去除所有符號,該區別仍然有利於Cygwin:8.5 KiB與15.5 KiB。 值得一提的是,它們都是在64位模式下編譯的。

這可能部分是由於需要靜態庫(mingw-w64通常使用靜態鏈接)與共享庫/ dll文件(Cygwin似乎通常使用動態鏈接)有關。 在Ubuntu上,會發生相同的事情,除了您可以正常選擇靜態庫或共享庫外,默認情況下是動態庫以保持文件較小。

一旦從<iostream>編譯使用std::cout C ++程序,在MinGW / mingw-w64上,文件大小就會大大增加。 使用-static-libstdc++編譯器選項使用libstdc++的靜態版本進行編譯時,在Cygwin上最終會產生較大的文件大小,但對於以下代碼而言,兩者最終都在550 KiB以上:

#include <iostream>
int main ()
{
  std::cout << "Hello, world!" << std::endl;
}

不知道它在Ubuntu上是什么,但我想它與靜態C ++庫相比相當大,而同等C代碼只有很少的KiB。 不過就我個人而言,我不會為此擔心。 俗話說,如今的存儲和內存相當便宜,因此,與擔心可執行文件的文件大小相比,我將更多的精力放在執行時間上,避免內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM