android 源码编译c-了解C程序编译过程的文章

本文讨论了 C 程序的完整编译过程,并描述了在预处理、编译、汇编和链接的每个阶段完成的编译任务。然后,通过编译示例,探索每个阶段的文件输出。

编译和链接

C程序的结构前面就了解了,编译了第一个C程序源代码,但计算机不能直接执行C程序源代码。由于C语言是高级语言,计算机无法识别高级语言编译的代码,需要将编写好的C程序源代码转换为计算机可以识别的机器语言代码,这称为C程序的编译过程。编译过程如图 1-7 所示。

图1-7 C程序编译过程

从图1-7可以看出,C程序编译过程分为四个阶段:第一阶段是预处理阶段;第二阶段是编译阶段;第三阶段是编译阶段;第四阶段是链接阶段。执行这四个阶段(预处理器、编译器、汇编器和链接器)的程序共同构成了 C 编译系统。预处理

阶段:预处理阶段主要用于处理源文件中的预处理指令,并根据指令对源代码进行更改和添加。例如:“#include”指令将头文件的内容补充到源文件中;“#define”指令用于宏定义,允许条件编译和内容替换。编译阶段

:编译阶段主要用于分析预处理文件的词法和句法android 源码编译c,并将其转换为等效于源代码的汇编代码。组装阶段

:组装阶段将编译输出的汇编代码转换为机器代码,也称为目标代码,与计算机硬件有关。链接

阶段:链接阶段将多个目标代码文件和库文件链接到可执行文件中。

编译实例

下面取面积计算器程序在”

C程序结构“为例,并使用Ubuntu系统下的GCC编译器编译和链接面积计算器程序。面积

计算器程序可以估计矩形、正方形、平行四边形和三角形的面积,它由main.c、rectangle.c、square.c、paraller.c、triangle.c、area.h五个源文件和一个头文件组成,area.h头文件描述了面积估计函数的原型。面积计算器程序的结构如图所示。有关程序代码,请参阅 C 程序结构。

图 1-8 面积计算器程序结构

预处理阶段预处理

阶段主要处理C程序源文件中的预处理指令,如 #include 指令和宏定义。预处理阶段会预处理所有 C 源文件,预处理后的文件也是可以用文本编辑器打开的文本文件,但它们的文件大小比 C 源文件大得多,因为预处理后的文件会将 #include 指令引入的头文件写入 C 源文件。面积计算器的main.c文件使用 #include 指令,主码如下:

//引入C语言标准输入输出函数库
//stdio.h是标准输入输出函数库的头文件
#include
//引入面积计算器函数头文件
include "area.h"
void main()
{
……
}

GCC 编译器提供以下命令来预处理 C 源文件:

gcc -e c 源文件 -o [预处理文件]。

例如:

gcc -E main.c -o main.i

主.c 文件经过预处理

,并且预处理的文件是 main.i。执行上述预处理命令时,需要 gcc 才能找到 main.c 文件。

在主预处理后,文件main.i

比main.c大很多,感兴趣的朋友可以在实际操作后用文本编辑器打开main.i文件,看看上面的内容。

面积计算器程序是所有C源文件预处理文件的列表,从列表中可以看出,除了main.c文件外,其他预处理文件和C源文件的文件大小变化不大,因为这个C源文件不包含头文件。

编译阶段

编译阶段将预处理后的文件转换为汇编代码,编译后的汇编代码也是文本文件,可以直接用文本编辑器打开汇编代码。

GCC 编译器提供以下命令来编译预处理的文件:

gcc -E 预处理文件 -o [汇编代码]。

例如:

gcc -S square.i -o square.s

编译 square.i 文件,编译后的文件是 square.s。执行上述预处理命令android 源码编译c,需要 gcc 才能找到 square.i 文件。

编译后的汇编代码如下图所示

编译阶段

装配阶段将汇编代码转换为机器代码(机器可以直接执行的CPU指令),转换程序也称为汇编程序。由于具有不同 CPU 体系结构的计算机提供不同的指令集和支持运行的不同机器代码,因此有必要在具有不同 CPU 体系结构的计算机上运行支持 CPU 体系结构的汇编程序。例如,IBM-PC使用Intel X86系列处理器,单片机通常使用ARM架构系列处理器,如果要使编译后的汇编程序在IBM-PC上运行,则需要调用支持IBM-PC指令集的汇编程序,如果希望编译后的汇编程序在ARM架构计算机上运行,则需要调用支持ARM指令集的汇编程序。

组装阶段输出的文件是目标文件,该文件采用二进制格式,无法使用文本编辑器浏览。GCC 编译器提供以下命令来预处理 C 源文件:

gcc -c 汇编代码文件 -o [对象文件]。

例如:

gcc -c 矩形.s -o 矩形.o

编译 rectangle.s 文件,编译后的文件是 rectangle.o。执行上述预处理命令时,需要 gcc 来查找 rectangle.s 文件。

执行装配阶段后,面积计算器程序文件列表如下图所示

链路阶段

面积计算器程序在组装阶段输出 main.o、square.o、triangle.o、rectangle.o、paraller.o 对象文件,并且这些对象文件必须在链接阶段作为可执行文件链接。链接使用 ld 命令,ld 是 GCC 提供的链接器,它将对象文件与库作为可执行程序或库文件链接。但是,ld 链接器通常不独立使用,GCC 手动调用链接器。

输入以下命令:

gcc main.c paraller.c rectangle.c square.c triangle.c

面积计算器程序的编译和链接完成。

本文摘要

通过上面的分析可以看出,C程序的编译过程经历了四个阶段:预处理、编译、汇编和链接。令人惊讶的是,C 程序编译工具提供了一次性编译和链接命令,编译器手动执行这四个阶段,而无需开发人员的参与。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 android 源码编译c-了解C程序编译过程的文章 https://www.wkzy.net/game/163241.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务