V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JiaFeiX
V2EX  ›  C

为何 TDM 版本 gcc 和 MING-W64 版本 gcc 同样编译出来的 32 位 C 大小不一致

  •  
  •   JiaFeiX · 2016-12-03 16:13:24 +08:00 · 2194 次点击
    这是一个创建于 2903 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同样的一段 Hello Word 的 C ,

    #include <stdio.h>
    
    int main(){
        printf("Hello World\n");
        return 0;
    }
    
    

    用 TDM-GCC 和 MING-W64 版本 gcc 同样编译出来 32 位的 exe ,为什么一个是 50kb ,一个是 28kb ,大出来的是干嘛的?

    截图:

    第一个是 64 位的,编译出来 130KB ,第 2 、 3 个都是 32 位的,为何编译出来大小差小一倍

    程序信息截图,都是 32 位的:

    4 个文件打包下载:

    http://pan.baidu.com/s/1c1FH5HQ

    10 条回复    2016-12-03 20:46:42 +08:00
    owt5008137
        1
    owt5008137  
       2016-12-03 16:20:26 +08:00 via Android
    gcc -V
    编译选项不一样的地方就是原因了哇
    当然还有那几个依赖库的版本和编译选项的原因
    wwqgtxx
        2
    wwqgtxx  
       2016-12-03 16:20:40 +08:00
    应该和他们自带的标准库有关吧,毕竟这两个 GCC 都是把标准库静态编译进去的
    JiaFeiX
        3
    JiaFeiX  
    OP
       2016-12-03 16:34:00 +08:00
    mingw64 32 位 GCC 参数是:
    ~~~
    C:\PRO_DEV\mingw-w64\mingw32\bin>gcc -v
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=C:/PRO_DEV/mingw-w64/mingw32/bin/../libexec/gcc/i686-w64-min
    gw32/6.2.0/lto-wrapper.exe
    Target: i686-w64-mingw32
    Configured with: ../../../src/gcc-6.2.0/configure --host=i686-w64-mingw32 --buil
    d=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw32 --with-sysroot=/c
    /mingw620/i686-620-posix-dwarf-rt_v5-rev1/mingw32 --enable-shared --enable-stati
    c --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-tim
    e=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --
    enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable
    -version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-sj
    lj-exceptions --with-dwarf2 --disable-isl-version-check --disable-libstdcxx-pch
    --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-reg
    istry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-
    ld --with-arch=i686 --with-tune=generic --with-libiconv --with-system-zlib --wit
    h-gmp=/c/mingw620/prerequisites/i686-w64-mingw32-static --with-mpfr=/c/mingw620/
    prerequisites/i686-w64-mingw32-static --with-mpc=/c/mingw620/prerequisites/i686-
    w64-mingw32-static --with-isl=/c/mingw620/prerequisites/i686-w64-mingw32-static
    --with-pkgversion='i686-posix-dwarf-rev1, Built by MinGW-W64 project' --with-bug
    url=http://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -I/c/mingw620/i6
    86-620-posix-dwarf-rt_v5-rev1/mingw32/opt/include -I/c/mingw620/prerequisites/i6
    86-zlib-static/include -I/c/mingw620/prerequisites/i686-w64-mingw32-static/inclu
    de' CXXFLAGS='-O2 -pipe -I/c/mingw620/i686-620-posix-dwarf-rt_v5-rev1/mingw32/op
    t/include -I/c/mingw620/prerequisites/i686-zlib-static/include -I/c/mingw620/pre
    requisites/i686-w64-mingw32-static/include' CPPFLAGS= LDFLAGS='-pipe -L/c/mingw6
    20/i686-620-posix-dwarf-rt_v5-rev1/mingw32/opt/lib -L/c/mingw620/prerequisites/i
    686-zlib-static/lib -L/c/mingw620/prerequisites/i686-w64-mingw32-static/lib -Wl,
    --large-address-aware'
    Thread model: posix
    gcc version 6.2.0 (i686-posix-dwarf-rev1, Built by MinGW-W64 project)
    ~~~

    TDM gcc 32 位参数为:

    ~~~
    C:\PRO_DEV\TDM-GCC-32\bin>gcc -v
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=C:/PRO_DEV/TDM-GCC-32/bin/../libexec/gcc/mingw32/5.1.0/lto-w
    rapper.exe
    Target: mingw32
    Configured with: ../../../src/gcc-5.1.0/configure --build=mingw32 --enable-langu
    ages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-libgomp --enable-lto --enable-g
    raphite --enable-libstdcxx-debug --enable-threads=posix --enable-version-specifi
    c-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-threads --enable
    -libstdcxx-time --with-gnu-ld --disable-werror --disable-nls --disable-win32-reg
    istry --disable-symvers --enable-cxx-flags='-fno-function-sections -fno-data-sec
    tions -DWINPTHREAD_STATIC' --prefix=/mingw32tdm --with-local-prefix=/mingw32tdm
    --with-pkgversion=tdm-1 --enable-sjlj-exceptions --with-bugurl=http://tdm-gcc.td
    ragon.net/bugs
    Thread model: posix
    gcc version 5.1.0 (tdm-1)
    ~~~



    @owt5008137
    @wwqgtxx
    canfoderiskii
        4
    canfoderiskii  
       2016-12-03 16:37:53 +08:00 via Android
    问个题外的问题: tdm 版本的 gcc 还有必要使用么?我几乎没用过,因为没看到有必须使用它的地方
    JiaFeiX
        5
    JiaFeiX  
    OP
       2016-12-03 16:44:08 +08:00
    @canfoderiskii 直接使用官方 gcc 版本?
    canfoderiskii
        6
    canfoderiskii  
       2016-12-03 16:52:35 +08:00 via Android
    @JiaFeiX 我用的 msys2 ,包含 mingw32, mingw64, msys 三种环境, pacman 包管理器。包更新也很及时。 GCC 当然也被包含在里面。
    wwqgtxx
        7
    wwqgtxx  
       2016-12-03 16:54:57 +08:00 via iPhone
    我都说了,他们两个用的 libc 不一定一样,不一定编译参数一样, libc 的版本就一样呀
    canfoderiskii
        8
    canfoderiskii  
       2016-12-03 17:03:33 +08:00 via Android
    @JiaFeiX 看了-v 的输出,两个 gcc 版本自身就差异很大,我猜除了 c 库的不同,高版本 gcc 可能会生成质量更高的代码。瞎猜
    missdeer
        9
    missdeer  
       2016-12-03 18:20:52 +08:00 via Android
    差一个大版本,这怎么比较
    sagaxu
        10
    sagaxu  
       2016-12-03 20:46:42 +08:00
    strip -s 剔除掉不必要的东西再比较大小
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1021 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:42 · PVG 05:42 · LAX 13:42 · JFK 16:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.