C语言编译过程

2 篇文章 0 订阅
2 篇文章 0 订阅
一、简介

GCC(GNU Compiler Collection,即GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。) GCC(特别是其中的C语言编译器)也常被认为是跨平台编译的事实标准。

Linux系统下的GCC编译器实际上是GNU编译工具链其中的一款软件,GCC不仅功能强大、性能优越,其执行效率比一般编译器高20%~30%,并且是开源免费的。

二、编译过程

计算机或者CPU只能“读懂”二进制文件,读不懂文本文件中的源代码,因此需要进行一个编译过程将一个源代码的文本文件转化为机器能识别的二进制指令文件,那么GCC就可以帮我们达到这个目的。

比如我们常用的编译命令:
gcc hello.c -o hello

上述命令意思是:使用gcc编译工具将当前目录下的hello.c转化为二进制文件hello;其中-o的意思是output,指明生成的二进制文件名,若不写-o hello,则默认生成一个a.out文件。


而实际上,由.c文件转化成二进制文件,要经历四个步骤,如图:
在这里插入图片描述

1.预处理

调用预处理器cpp,执行文件包含、宏定义、条件编译 等工作。另外注释删除、添加必要的调试信息也在该阶段。

如果想获得C源程序经过预处理之后的文件,方法如下:

gcc hello.c -o hello.i -E

得到一个.i的文本文件,这样我们就可以查看源程序宏展开的样子。

2.编译

四个步骤中最复杂的阶段,包括词法和语法的分析,使用ccl,最终生成对应硬件平台的汇编语言(如果是GCC则生成x86格式的汇编文件,如果是ARM平台的交叉编译,则生成ARM格式的汇编文件)。

如果想获得C源程序经过预处理编译之后的文件,方法如下:

1)由.c文件生成:gcc hello.c -o hello.s -S

2)由.i文件生成:gcc hello.i -o hello.s -S

得到一个.s文件,这是一个x86格式的汇编程序文件。

3.汇编

调用汇编器as将汇编源程序翻译成为ELF格式的可重定位文件,但是程序程序中的全局符号尚未定位,所以还不能直接运行。

如果想得到这样的文件,方法如下:

1)由.c文件生成:gcc hello.c -o hello.o -c

2)由.i文件生成:gcc hello.s -o hello.o -c

4.链接

经过以上三个步骤得到的二进制文件还需要经过重定位合并相同权限的段。一般情况下,我们编译一个程序通常都需要链接系统的标准C库、gcc内置库等基本库文件。

gcc hello.o -o hello -lc - lgcc -lc和-lgcc可省略

三、编译选项
选项作用示例
-o指定输出文件名gcc a.c-oa
-E输出预处理后的代码文件gcc a.c-oa.i-E
-S输出编译后的汇编代码文件gcc a.c-oa.s-S
-C输出链接后的可重定位文件gcc a.c-oa.o-c
-g在编译结果中加入调试信息gcc a.c-oa-g
-Ipath>指定头文件路径gec a.c-oa-L/include
-L 指定库文件路径gec a.c-oa-L./lib
-O指定优化等级gcc a.c-oa-O 2
-static使用静态链接gcc a.c-oa-lxxx-static
-Wall打开所有的警告gec a.c-oa-Wall
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值