MinGW gcc vs linux gcc可执行文件大小

时间:2016-11-05 16:22:29

标签: c gcc compilation mingw

我写了这个小C程序

#include <stdio.h>

int main() {
    int i = 0;
    while (i < 10){
        printf("%i", i);
        i++;
    }

}

如果我使用MinGW gcc编译它,可执行文件是59kb,但如果我用linux gcc编译它,通过windows shell上的ubuntu,可执行文件只有9kb。 50kb似乎是很多额外的数据......为什么会这样?

1 个答案:

答案 0 :(得分:3)

根据MinGW wiki,可以从与您的可执行文件链接的库中包含调试信息。您可以使用gcc&#34; -s&#34;从可执行文件中排除调试信息。选项或&#34; strip&#34;命令。

支持&#34; Gnu风格&#34;或者&#34; MS风格&#34; printf格式似乎是MinGW stdio和GNU C库stdio之间的差异之一。

的MinGW

#>  gcc --version
gcc.exe (GCC) 5.3.0

#>  gcc -o printf_gcc_mingw.exe printf.c
#>  gcc -s -o printf_gcc_strip_mingw.exe printf.c
#>  du -ch *.exe
59K     printf_gcc_mingw.exe
45K     printf_gcc_strip_mingw.exe

的MinGW-W64

#>  gcc -o printf_gcc.exe printf.c
#>  gcc -s -o printf_gcc_strip.exe printf.c
#>  gcc --version
gcc (tdm64-1) 5.1.0
#>  dir *.exe    
           132,613 printf_gcc.exe
            16,896 printf_gcc_strip.exe     
#>objdump -x printf_gcc_strip.exe 
    DLL Name: msvcrt.dll
    vma:  Hint/Ord Member-Name Bound-To
    85ca       55  __C_specific_handler
    85e2       78  __dllonexit
    85f0       81  __getmainargs
    8600       82  __initenv
    860c       83  __iob_func
    861a       91  __lconv_init
    862a       97  __set_app_type
    863c       99  __setusermatherr
    8650      116  _acmdln
    865a      123  _amsg_exit
    8668      141  _cexit
    8672      252  _fmode
    867c      330  _initterm
    8688      438  _lock
    8690      610  _onexit
    869a      820  _unlock
    86a4     1031  abort
    86ac     1049  calloc
    86b6     1062  exit
    86be     1081  fprintf
    86c8     1088  free
    86d0     1099  fwrite
    86da     1146  malloc
    86e4     1154  memcpy
    86ee     1163  printf
    86f8     1184  signal
    8702     1205  strlen
    870c     1208  strncmp
    8716     1240  vfprintf

Visual Studio 2015

#>  cl /MD printf.c /link  /out:printf_vs.exe
#>  dir *.exe    
             9,728 printf_vs.exe

#>printf_vs.exe
0123456789