tmd-gcc 和 mingw 编译结果体积之差

自由建客 2011-08-16 11:13:19
Win2003 x86 环境
http://tdm-gcc.tdragon.net/download
tdm-gcc-4.5.2.exe
tdm64-gcc-4.5.2.exe
http://sourceforge.net/projects/mingw-w64/files/
mingw-w32-bin_i686-mingw_20110510_sezero.zip
mingw-w64-bin_i686-mingw_20110510_sezero.zip

编译 hello.c 输出结果,体积相差很远, 64 位的在这环境自然无法运行,这次编译只是看看体积。
MinGW-w64 的 bin 下没有 gcc.exe 要自己建个硬链接到 x86_64-w64-mingw32-gcc.exe ,试图用 -m32 编译 32 位目标失败。

...全文
2241 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyjkchen 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ch_fb 的回复:]

引用 8 楼 xunxun1982 的回复:

引用 4 楼 ch_fb 的回复:

编译个 C++ 版的 hello world 更大,都是好几兆,好像默认就是把 libstdc++ 都静态连接进去了。

请问你strip了么
请问你禁用rtti了么
请问你禁用异常了么
请问你使用-Os编译了么
这些保证你简单的C++程序在300K-600K

如果你把libstdc+……
[/Quote]
不太清楚,不过borland c++ 3.0生成的程序之小,在当年的16位编译器中首屈一指
自由建客 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xunxun1982 的回复:]

引用 4 楼 ch_fb 的回复:

编译个 C++ 版的 hello world 更大,都是好几兆,好像默认就是把 libstdc++ 都静态连接进去了。

请问你strip了么
请问你禁用rtti了么
请问你禁用异常了么
请问你使用-Os编译了么
这些保证你简单的C++程序在300K-600K

如果你把libstdc++使用lto编译,那么链接时采用lto插件体积也会更……
[/Quote]
我只懂 -Os

另外,那个“vc的链接开关opt:ref之类”就是传说中 Borland 当年创的最小连接吗?对静态连接,只连接用到的函数。
xunxun 2011-08-17
  • 打赏
  • 举报
回复
你们有能力有时间的话,都可以看看这个补丁
http://sourceware.org/bugzilla/show_bug.cgi?id=11539

我过段时间会尝试解决入口的问题
jackyjkchen 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xunxun1982 的回复:]

引用 14 楼 jackyjkchen 的回复:
类似于VC的/GL(链接时代码生成优化)?
一直不太清楚gcc的windows版在体积上究竟怎么回事,Linux下生成的程序明显很小,Windows下经常很大

和GL的特性基本一样。
Linux下一般都是动态链接到libgcc/libc的,windows下的crt都是符号定向到msvcrt.dll的,那么在编译gcc时可以控制是否编译……
[/Quote]

原来如此,一直猜想是gcc for windows链接的时候没有把那些未使引用用的代码摘除掉,看来就是这个原因
xunxun 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jackyjkchen 的回复:]
类似于VC的/GL(链接时代码生成优化)?
一直不太清楚gcc的windows版在体积上究竟怎么回事,Linux下生成的程序明显很小,Windows下经常很大
[/Quote]
和GL的特性基本一样。
Linux下一般都是动态链接到libgcc/libc的,windows下的crt都是符号定向到msvcrt.dll的,那么在编译gcc时可以控制是否编译动态版,比如libgcc*.dll出来,但windows下很多人不喜欢这样依赖那么多dll,所以libgcc一般都是静态的。
还有一个开关没有成功移植,不是gcc的原因,而是binutils方面,就是相当于vc的链接开关opt:ref之类的功能,这个可以大大减小体积。
binutils上某人写了个实验性的补丁,经人测试,编译的Qt减小了1/3的大小,不过那个人是Linux程序员,不是Windows的,所以只放出来让windows程序员review,现在还没人应答。
只能等MinGW64的Kai有时间看看了。我对PE格式不是很懂,那个补丁基本没看懂……
jackyjkchen 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xunxun1982 的回复:]

引用 9 楼 jackyjkchen 的回复:

引用 8 楼 xunxun1982 的回复:

引用 4 楼 ch_fb 的回复:

编译个 C++ 版的 hello world 更大,都是好几兆,好像默认就是把 libstdc++ 都静态连接进去了。

请问你strip了么
请问你禁用rtti了么
请问你禁用异常了么
请问你使用-Os编译了么
这些保证你简单的C++程……
[/Quote]
类似于VC的/GL(链接时代码生成优化)?

一直不太清楚gcc的windows版在体积上究竟怎么回事,Linux下生成的程序明显很小,Windows下经常很大
xunxun 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jackyjkchen 的回复:]

引用 10 楼 jackyjkchen 的回复:

一个排序算法加上读写文件的例子,10KB出头,C++和C都是,已经和VC一个量级了

忘说了,不用STL,gcc用stl体积膨胀非常厉害,VC就没事,可能是VC把许多stl的非模板底层算法都封装进了运行库的关系,没在头文件里使用太长的内联
[/Quote]
不要这样比较。应该和VC的静态链接比较才对。
gcc也可以把stl动态链接,虽然我还是喜欢静态版。
编译gcc时使用-Os重编译可以使得更小
xunxun 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jackyjkchen 的回复:]

引用 8 楼 xunxun1982 的回复:

引用 4 楼 ch_fb 的回复:

编译个 C++ 版的 hello world 更大,都是好几兆,好像默认就是把 libstdc++ 都静态连接进去了。

请问你strip了么
请问你禁用rtti了么
请问你禁用异常了么
请问你使用-Os编译了么
这些保证你简单的C++程序在300K-600K

如果你把libstdc+……
[/Quote]
4.4的当然小了,但性能不可与4.6相比。
lto插件是4.6特有的,我用这个把gettext的体积减小了惊人的50%左右。
jackyjkchen 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jackyjkchen 的回复:]

一个排序算法加上读写文件的例子,10KB出头,C++和C都是,已经和VC一个量级了
[/Quote]
忘说了,不用STL,gcc用stl体积膨胀非常厉害,VC就没事,可能是VC把许多stl的非模板底层算法都封装进了运行库的关系,没在头文件里使用太长的内联
jackyjkchen 2011-08-17
  • 打赏
  • 举报
回复
一个排序算法加上读写文件的例子,10KB出头,C++和C都是,已经和VC一个量级了
jackyjkchen 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xunxun1982 的回复:]

引用 4 楼 ch_fb 的回复:

编译个 C++ 版的 hello world 更大,都是好几兆,好像默认就是把 libstdc++ 都静态连接进去了。

请问你strip了么
请问你禁用rtti了么
请问你禁用异常了么
请问你使用-Os编译了么
这些保证你简单的C++程序在300K-600K

如果你把libstdc++使用lto编译,那么链接时采用lto插件体积也会更……
[/Quote]

还可以更小,我这里用loaden编译的那个gcc 4.4.4,只要禁用异常,C++程序基本上和C一样。

也就是能达到类似VC的效果(VC就是C++程序体积上与C几乎一样)
xunxun 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ch_fb 的回复:]

编译个 C++ 版的 hello world 更大,都是好几兆,好像默认就是把 libstdc++ 都静态连接进去了。
[/Quote]
请问你strip了么
请问你禁用rtti了么
请问你禁用异常了么
请问你使用-Os编译了么
这些保证你简单的C++程序在300K-600K

如果你把libstdc++使用lto编译,那么链接时采用lto插件体积也会更小。
luciferisnotsatan 2011-08-17
  • 打赏
  • 举报
回复
我是看了标题 tmd-gcc 进来看看啥情况的
jackyjkchen 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ch_fb 的回复:]

C/C++ code
tdm-gcc 27,589
MinGW-w32 85,017
tdm64-gcc 120,501
-m32 97,305
MinGW-w64 116,607
-m32 失败


同是 32 位结果,体积怎么相差这么多?
[/Quote]
gcc -v,gcc本身的编译选项不一样,对输出会有很大影响
jackyjkchen 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ch_fb 的回复:]

编译个 C++ 版的 hello world 更大,都是好几兆,好像默认就是把 libstdc++ 都静态连接进去了。
[/Quote]
貌似是gcc在windows平台的一个bug,链接了异常处理,加-fno-exceptions就能显著减少体积
自由建客 2011-08-17
  • 打赏
  • 举报
回复
编译个 C++ 版的 hello world 更大,都是好几兆,好像默认就是把 libstdc++ 都静态连接进去了。
xunxun 2011-08-17
  • 打赏
  • 举报
回复
虽然tdm的mingw64是32/64混合版,但并不推荐使用。

一则是他的版本较低,现在mingw64的crt已经2.0rc了,milestone在3.0b阶段。
tdm的更新比较慢,还是使用的1.0b。
二则混合版在使用上有诸多bug,一般使用还是建议单一版。

sizero和Ruben都提供单一版,sizero的gcc版本较旧,为4.4/4.5,Ruben的较新,为4.6。

如果单纯的比较体积,没有什么意义,这个和采用的异常模型还有编译开关有巨大的关系。
我也可以整个编译体积最小的mingw64 gcc,所以想达成这一目标,最好自行编译。
另外不同版本的gcc的-O2/-O3开关也有调整。4.5之后的tree也有调整,通常比4.4编译的大,但是4.6时可以使用lto插件来大大优化减小体积。

另外,gcc类似vc的链接消去的开关还没成功移植,只有实验性的补丁,据初步测试,这个补丁可以降低exe多达1/3的体积(gcc的bugzilla上某人针对Qt的测试)。
自由建客 2011-08-16
  • 打赏
  • 举报
回复
tdm-gcc		 27,589
MinGW-w32 85,017
tdm64-gcc 120,501
-m32 97,305
MinGW-w64 116,607
-m32 失败


同是 32 位结果,体积怎么相差这么多?
自由建客 2011-08-16
  • 打赏
  • 举报
回复
tdm-gcc 27,589
MinGW-w32 85,017
tdm64-gcc 120,501
-m32 97,305
MinGW-w64 116,607
-m32 失败

同是 32 位结果,体积怎么相差这么多?

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧