数智学习中心 计科随机库
学习专区 Linux专栏 博客圈 计科之路 登录
编译过程分成预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking) 四个步骤

为了更好地体现gcc的工作过程,可以把上述编译过程分成预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking) 四个步骤单独进行,并观察每步的运行结果。

命令行中 gcc表示用gcc来编译源程序,hello.c是源程序文件,-o hello选项表示要求编译器输出的可执行文件名为hello。从程序员的角度看,只需简单地执行一条gcc命令就可以了;但从编译器的角度来看,却需要完成一系列非常繁杂的工作。首先,gcc需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入#include语句所包含的内容;接着,gcc会调用ccl和as将处理后的源代码编译成目标代码;最后,gcc会调用链接程序ld,把生成的目标代码链接成一个可执行程序。

Step1:预处理

预处理通过对宏定义(像#define)进行展开,对头文件(像 stdio.h)进行展开,对条件进行(像ifdef)编译,展开所有宏,删除所有注释(像"//")。预处理cpp把源代码以及头文件预编成一个.i文件。命令如下:

gcc -E hello.c -o hello.i

1

gcc的-E参数,可以让编译器在预编译后停止,并输出预编译结果(hello.i文件)。

在这里插入图片描述

此时若查看hello.i文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而且被预处理的宏定义也都作了相应的处理。

在这里插入图片描述

注意:这时并不检查语法,所以即使有语法错误也不会报错。

Step2:编译

编译也就是检查语法是否错误,将预处理过的文件编译成汇编(.s)文件。命令如下:

gcc -S hello.i -o hello.s

1

在这里插入图片描述

在这里插入图片描述

Step3:汇编

汇编也就是将汇编(.s)文件生成目标文件(二进制文件)。通过汇编,文本代码变成了二进制代码(二进制代码文件以.o为后缀名)。命令如下:

gcc -c hello.s -o hello.o

1

在这里插入图片描述

打开hello.o文件,是一堆乱码,因为.o文件为二进制文件。

在这里插入图片描述

Step4:链接

链接过程就是找到依赖的库文件(静态与动态),将目标文件链接为可执行程序。命令如下:

gcc 目标文件 -o 可执行程序 -l动态库名

1

假如没有动态库的话,直接使用以下命令:

gcc 目标文件 -o 可执行程序

1

对于本例,则输入命令如下:

gcc hello.o -o hello

1

在这里插入图片描述

GCC官网地址:https://gcc.gnu.org/ GCC官网入口

评论留言

一共0条留言