Linux下C编程基础之:gcc编译器
3.3gcc编译器
GNUCC(简称为gcc)是GNU项目中符合ANSIC标准的编译系统,能够编译用C、C++和ObjectC等语言编写的程序。gcc不仅功能强大,而且可以编译如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多种语言,而且gcc是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。本章中的示例,除非特别注明,否则均采用4.x.x的gcc版本。
表3.6所示为gcc支持编译源文件的后缀及其解释。
表3.6 gcc所支持后缀名解释
后缀名 |
所对应的语言 |
后缀名 |
所对应的语言 |
.c |
C原始程序 |
.s/.S |
汇编语言原始程序 |
.C/.cc/.cxx |
C++原始程序 |
.h |
预处理文件(头文件) |
.m |
Objective-C原始程序 |
.o |
目标文件 |
.i |
已经过预处理的C原始程序 |
.a/.so |
编译后的库文件 |
.ii |
已经过预处理的C++原始程序 |
… |
… |
3.3.1gcc编译流程解析
如本章开头提到的,gcc的编译流程分为了4个步骤,分别为:
n 预处理(Pre-Processing);
n 编译(Compiling);
n 汇编(Assembling);
n 链接(Linking)。
下面就具体来查看一下gcc是如何完成以上4个步骤的。
首先看一下hello.c的源代码:
#includestdio.h>
intmain()
{
printf(Hello!Thisisourembeddedworld!n);
return0;
}
(1)预处理阶段。
在该阶段,对包含的头文件(#include)和宏定义(#define、#ifdef等)进行处理。在上述代码的预处理过程中,编译器将包含的头文件stdio.h编译进来,并且用户可以使用gcc的选项“-E”进行查看,该选项的作用是让gcc在预处理结束后停止编译过程。
注意 |
gcc指令的一般格式为:gcc[选项]要编译的文件[选项][目标文件] 其中,目标文件可缺省,gcc默认生成可执行的文件,名为:编译文件.out |
[root@localhostgcc]#gcc–Ehello.c–ohello.i
在此处,选项“-o”是指目标文件,由表3.6可知,“.i”文件为已经过预处理的C程序。以下列出了hello.i文件的部分内容:
typedefint(*__gconv_trans_fct)(struct__gconv_step*,
struct__gconv_step_data*,void*,
__constunsignedchar*,
__constunsignedchar**,
__constunsignedchar*,unsignedchar**,
size_t*);
…
#2hello.c2
intmain()
{
printf(Hello!Thisisourembeddedworld!n);
return0;
}
由此可见,gcc确实进行了预处理,它把“stdio.h”的内容插入hello.i文件中。
(2)编译阶段。
接下来进行的是编译阶段,在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,结果生成汇编代码。
[root@localhostgcc]#gcc–Shello.i–ohello.s
以下列出了hello.s的内容,可见gcc已经将其转化为汇编代码了,感兴趣的读者可以分析一下这一个简单的C语言小程序是如何用汇编代码实现的。
.filehello.c
.section.rodata
.align4
.LC0:
.stringHello!Thisisourembeddedworld!
.text
.globlmain
.typemain,@function
main:
pushl%ebp
movl%esp,%ebp
subl$8,%esp
andl$-16,%esp
movl$0,%eax
addl$15,%eax
addl$15,%eax
shrl$4,%eax
sall$4,%eax
subl%eax,%esp
subl$12,%esp
pushl$.LC0
callputs
addl$16,%esp
movl$0,%eax
leave
ret
.sizemain,.-main
.identGCC:(GNU)4.0.0200XYZ19(RedHat4.0.0-8)
.section.note.GNU-stack,,@progbits
(3)汇编阶段。
汇编阶段是把编译阶段生成的“.s”文件转成目标文件,读者在此使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了,如下所示:
[root@localhostgcc]#gcc–chello.s–ohello.o
linux操作系统文章专题:linux操作系统详解(linux不再难懂)linux相关文章:linux教程
c++相关文章:c++教程
评论