00-C语言入门基础(C程序编译的基本过程)
一.C程序编译的基本过程
1.1 编辑
编辑实际上就是使用纯文本的编辑器(无论你是使用Windows自带的记事本,还是Mac或Linux自带的vim编辑器,又或者是gedit也好)来编辑源代码
编辑的文本文档的格式通常为.c结尾的纯文本文件。

1.2 预处理
1.2.1 将所有的#define删除,并展开所有的宏定义
1.2.2 处理所有的条件编译指令,例如#ifndef,#define,#endif,#elif,#else等
1.2.3 处理#include指令,也就是将头文件插入到预编译指令的位置,然而头文件可能还包括其他头文件,因此这个过程是递归的
1.2.4 删除所有的注释,例如//,/**/
1.2.5 添加行号和标识(当编译出错时我们往往会看到究竟是哪一行出的错,实际上这也就是编译器要帮忙做的事情)
1.2.6 保留所有的#pragma编译指令,编译器会在编译阶段用到他们。
预处理的结果是将.c文件处理为.i文件,在这个文件中已经不包含任何的宏定义,因为他们在预处理阶段已经被展开过了。
我们可以使用gcc -E hello.c -o hello.i来输出预编译后的结果(-E表示只进行预处理)

当然由于预处理后的hello.i文件内容很多,这里只上传部分代码(大家看看就好)

1.3 编译和汇编
编译过程实际上就是将预处理完成后的.i文件进行一系列的词法分析,语法分析,语义分析及优化后来产生相应的汇编代码文件(.s文件)
实际上现代的gcc编译器早已将编译和汇编合为一个步骤来完成了。
我们可以使用gcc -S hello.i -o hello.s来对预处理文件进行汇编处理

当得到汇编文件之后,我们使用gcc -c hello.s之后就可以得到目标文件了(这种文件在Linux下叫做.o文件,在Windows下则是以.obj结尾的
文件)

1.5 链接
链接的过程实际上就是将我们编写的程序中需要使用到的内置函数来和实际的库文件进行链接的过程(例如我们这个程序中用到的printf函数,这个
函数并不是我们自己手工实现的,而是使用的标准C语言库中的函数,实际上这个printf函数会被封装在一个叫做printf.o的目标文件里面,它会和这个
函数进行链接),然后生成可执行文件(实际上这种可执行文件在Linux下叫做ELF格式,在Windows下则叫做PE/COFF格式,这两种格式都是基于段的
格式)
使用gcc hello.o就可以将hello.o文件链接为a.out可执行文件

1.6 执行
gcc hello.o后得到的可执行文件的格式是a.out这种格式,如果需要自己决定可执行文件的名字,那么就使用[gcc hello.o -o 你想起的名字]
即可。

浙公网安备 33010602011771号