新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Linux下C编程基础之:gcc编译器

Linux下C编程基础之:gcc编译器

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257151.htm

3.3

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++教程



上一页 1 2 3 4 下一页

评论


相关推荐

技术专区

关闭