Chinaunix首页 | 论坛 | 博客
  • 博客访问: 508535
  • 博文数量: 35
  • 博客积分: 3472
  • 博客等级: 中校
  • 技术积分: 935
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-04 06:54
文章分类
文章存档

2014年(4)

2013年(2)

2011年(3)

2010年(9)

2009年(9)

2008年(8)

分类: LINUX

2009-07-24 14:40:28


在本机编译gcc之后,在目标目录/usr下可以看到如下几个目录:
bin  include  info  lib  libexec  man  share

bin目录包含如下文件:
addr2name.awk  fastjar  gccbug      gcjh  grepjar       jcf-dump   
c++            g++      gcj         gcov  grmic         jv-convert 
cpp            gcc      gcj-dbtool  gij   grmiregistry  jv-scan    
powerpc-unknown-linux-gnu-c++  powerpc-unknown-linux-gnu-gcc-4.0.0
powerpc-unknown-linux-gnu-g++  powerpc-unknown-linux-gnu-gcj
powerpc-unknown-linux-gnu-gcc  powerpc-unknown-linux-gnu-gcjh

我们经常用的也就是gcc, g++, gcj。其他的就不太熟悉了。

gcc 是c的编译器,也是c, c++, java等编译器的入口,如果要编译的不是c文件,gcc会调用其他的编译器来编译。
g++是c++的编译器。

关于gcc和g++的区别,参考知秋小筑

CC一般是makefile里面的一个名字,具体是什么根据实际情况决定。
gcc和g++都是GNU(组织)的一个编译器。
 
误区一:gcc只能编译c代码,g++只能编译c++代码
两者都可以,但是请注意:
1,后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
2,编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。
 
误区二:gcc不会定义__cplusplus宏,而g++会
实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。
 
误区三:编译只能用gcc,链接只能用g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。
 
addr2name:这是用来替代某些系统上不存在addr2line的脚本。addr2line可以根据指定的elf文件中的地址来定位对应的源代码,当然这需要debug信息的支持。

fastjar:用来替代jdk中提供的jar命令,完全用c实现,所以效率比jar高。

gccbug:是一个shell脚本,帮助创建有价值的bug报告.gccbug会收集你的机器信息以及编译器本身的配置信息。

gcjh: 在开发JNI的时候,可以使用gcjh来为指定的class生成native头文件。

grepjar: 可以用来在jar文件中搜索指定模式的文字。"grep in a jar"

jcf-dump: 用来输出某个class的相关信息。

c++:这个和g++一样,不知道为什么不做个link。

gcj:gcc的java前端,可以把java源文件,java字节码编译成可执行的二进制文件。

gcov:覆盖测试工具,可以验证程序中哪些部分没有运行,一般用来确定测试用例的覆盖程度。

grmic: 用来生成java rmi的stub。"java rmi creator"?

jv-convert: 类似linux下的iconv,用来把文件从一种编码转成另外一种编码。

cpp: 是C预处理器。编译器用它来将 #include 和 #define 这类声明在源文件中展开。

gcj-dbtool: 用来管理java class文件映射数据库的工具,还不太清楚这个数据库具体用做什么。

gij:类似于jdk中的java,java字节码解释器

grmiregistry:用来启动java rmi远程组件的注册服务。

jv-scan:打印java源文件的有关信息。

接下来一些带前缀的文件其实都是和不带前缀的文件一样,应该只是为了调用方便,目前还不清楚哪些程序会使用他们(用这个编译器去生成交叉编译器时用?)为什么不做成link呢?

其他文件和库还有下面这些,下次再说吧。

安装下列程序: cc1, cc1plus, collect2

安装下列库文件: libgcc.a, libgcc_eh.a, libgcc_s.so, libstdc++.[a,so] 和 libsupc++.a




阅读(1663) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~