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

2016-12-03 16:13:24 +08:00
 JiaFeiX

同样的一段 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

2107 次点击
所在节点    C
10 条回复
owt5008137
2016-12-03 16:20:26 +08:00
gcc -V
编译选项不一样的地方就是原因了哇
当然还有那几个依赖库的版本和编译选项的原因
wwqgtxx
2016-12-03 16:20:40 +08:00
应该和他们自带的标准库有关吧,毕竟这两个 GCC 都是把标准库静态编译进去的
JiaFeiX
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
2016-12-03 16:37:53 +08:00
问个题外的问题: tdm 版本的 gcc 还有必要使用么?我几乎没用过,因为没看到有必须使用它的地方
JiaFeiX
2016-12-03 16:44:08 +08:00
@canfoderiskii 直接使用官方 gcc 版本?
canfoderiskii
2016-12-03 16:52:35 +08:00
@JiaFeiX 我用的 msys2 ,包含 mingw32, mingw64, msys 三种环境, pacman 包管理器。包更新也很及时。 GCC 当然也被包含在里面。
wwqgtxx
2016-12-03 16:54:57 +08:00
我都说了,他们两个用的 libc 不一定一样,不一定编译参数一样, libc 的版本就一样呀
canfoderiskii
2016-12-03 17:03:33 +08:00
@JiaFeiX 看了-v 的输出,两个 gcc 版本自身就差异很大,我猜除了 c 库的不同,高版本 gcc 可能会生成质量更高的代码。瞎猜
missdeer
2016-12-03 18:20:52 +08:00
差一个大版本,这怎么比较
sagaxu
2016-12-03 20:46:42 +08:00
strip -s 剔除掉不必要的东西再比较大小

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/325038

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX