免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123456
最近访问板块 发新帖
楼主: li2002
打印 上一主题 下一主题

大家注意到没有?gnu的c++编译器编成的文件怎么很大呀? [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
51 [报告]
发表于 2003-08-03 00:32 |只看该作者

大家注意到没有?gnu的c++编译器编成的文件怎么很大呀?

在LD_LIBRARY_PATH加上这个libc的静态库的路径,并且让其生效,试试,呵呵。

重新用g++编译以后生成的文件就不再用libstdc++.so,并且变得小了一些!但是比用cc编译出来的仍然大了一点。

这个属于合理的。

现在可以对照g++和cc对于动态和静态两种方式的大小,然后strip后在比较一下。

论坛徽章:
0
52 [报告]
发表于 2003-08-03 08:04 |只看该作者

大家注意到没有?gnu的c++编译器编成的文件怎么很大呀?

用LD_LIBRARY_PATH设了以后g++仍不能工作,看来有必要编译一个静态链接的g++ ?
我又做了几个实验,由于观察到对g++编译的程序额外用到了libstdc++.so和libm.so,我把它们都藏起来,这样用cc和g++都会生成完全一样的执行程序,另外用-static选项进行编译,也生成完全一样的程序,再进行strip,执行程序的大小按照预期,变得小了很多。
另外如果包含的不是stdio.h而是iostream.h,生成的程序会大很多。
通过这些实验,我严重怀疑cc和g++用了同一个代码生成器,只是在链接的时候有所不同,如果条件允许,g++会自动加上libstdc++.so和libm.so,或许在别的平台上会加上libcrypt.so之类
关于cc和g++在这方面的对比是否可以算是得出了结论?
我想更深入的验证也可以做一做,比如生成汇编代码、生成.o文件比一比大小、让编译器把自己的详细操作都显示出来,还有编译一个静态链接的cc和g++,再来试验把libc.so也藏起来。。。好多喔 有兴趣和有时间的朋友试一下?再次推荐在FreeBSD上试。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
53 [报告]
发表于 2003-08-03 09:16 |只看该作者

大家注意到没有?gnu的c++编译器编成的文件怎么很大呀?

看见你们讨论得如此热闹,我好羡慕呀!
可是,本人水平太差,看见C++好怕怕!

论坛徽章:
0
54 [报告]
发表于 2003-08-03 11:20 |只看该作者

大家注意到没有?gnu的c++编译器编成的文件怎么很大呀?

呵呵偶来个终结版。。
cc的详细过程:

  1. [lemon@bsd]$ cc -v test.cpp
  2. Using builtin specs.
  3. gcc version 2.95.3 20010315 (release) [FreeBSD]
  4. /usr/libexec/cpp0 -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -Di386 -D__FreeBSD__=4 -D__FreeBSD_cc_version=440000 -Dunix -D__i386__ -D__FreeBSD__=4 -D__FreeBSD_cc_version=440000 -D__unix__ -D__i386 -D__unix -Acpu(i386) -Amachine(i386) -Asystem(unix) -Asystem(FreeBSD) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__ELF__ test.cpp /tmp/ccDLmMO1.ii
  5. GNU CPP version 2.95.3 20010315 (release) [FreeBSD] (i386 FreeBSD/ELF)
  6. #include "..." search starts here:
  7. #include <...>; search starts here:
  8. /usr/include/g++
  9. /usr/include
  10. /usr/include
  11. End of search list.
  12. The following default directories have been omitted from the search path:
  13. End of omitted list.
  14. /usr/libexec/cc1plus /tmp/ccDLmMO1.ii -quiet -dumpbase test.cc -version -o /tmp/cckbiN8A.s
  15. GNU C++ version 2.95.3 20010315 (release) [FreeBSD] (i386-unknown-freebsd) compiled by GNU C version 2.95.3 20010315 (release) [FreeBSD].
  16. /usr/libexec/elf/as -v -o /tmp/ccGCij1s.o /tmp/cckbiN8A.s
  17. GNU assembler version 2.11.2 20010719 [FreeBSD] (i386-unknown-freebsd4) using BFD version 2.11.2 20010719 [FreeBSD]
  18. /usr/libexec/elf/ld -m elf_i386 -dynamic-linker /usr/libexec/ld-elf.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/libexec/elf -L/usr/libexec -L/usr/lib /tmp/ccGCij1s.o -lgcc -lc -lgcc /usr/lib/crtend.o /usr/lib/crtn.o
复制代码

g++的详细过程:

  1. [lemon@bsd]$ rm a.out
  2. [lemon@bsd]$ g++ -v test.cpp
  3. Using builtin specs.
  4. gcc version 2.95.3 20010315 (release) [FreeBSD]
  5. /usr/libexec/cpp0 -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -Di386 -D__FreeBSD__=4 -D__FreeBSD_cc_version=440000 -Dunix -D__i386__ -D__FreeBSD__=4 -D__FreeBSD_cc_version=440000 -D__unix__ -D__i386 -D__unix -Acpu(i386) -Amachine(i386) -Asystem(unix) -Asystem(FreeBSD) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__ELF__ test.cpp /tmp/ccSmiXAt.ii
  6. GNU CPP version 2.95.3 20010315 (release) [FreeBSD] (i386 FreeBSD/ELF)
  7. #include "..." search starts here:
  8. #include <...>; search starts here:
  9. /usr/include/g++
  10. /usr/include
  11. /usr/include
  12. End of search list.
  13. The following default directories have been omitted from the search path:
  14. End of omitted list.
  15. /usr/libexec/cc1plus /tmp/ccSmiXAt.ii -quiet -dumpbase test.cc -version -o /tmp/cclRbRCe.s
  16. GNU C++ version 2.95.3 20010315 (release) [FreeBSD] (i386-unknown-freebsd) compiled by GNU C version 2.95.3 20010315 (release) [FreeBSD].
  17. /usr/libexec/elf/as -v -o /tmp/ccuYGOYV.o /tmp/cclRbRCe.s
  18. GNU assembler version 2.11.2 20010719 [FreeBSD] (i386-unknown-freebsd4) using BFD version 2.11.2 20010719 [FreeBSD]
  19. /usr/libexec/elf/ld -m elf_i386 -dynamic-linker /usr/libexec/ld-elf.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/libexec/elf -L/usr/libexec -L/usr/lib /tmp/ccuYGOYV.o -lstdc++ -lm -lgcc -lc -lgcc /usr/lib/crtend.o /usr/lib/crtn.o
复制代码

前面都是一样的,只是在链接的时候g++多了一个
-lstdc++ -lm
注意看最后一步
看起来cc和g++只是一个前端

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
55 [报告]
发表于 2003-08-04 10:01 |只看该作者

大家注意到没有?gnu的c++编译器编成的文件怎么很大呀?

可以用ldd查看程序链接了哪些动态库。

论坛徽章:
0
56 [报告]
发表于 2003-08-04 15:29 |只看该作者

大家注意到没有?gnu的c++编译器编成的文件怎么很大呀?

偶回来看大家讨论得真热阿,又学了不少,谢谢各位高手!
还想问大家一下:那里有g++编译参数的详细说明呢,用google也没搜到多少详细的东东。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP