0、前言
之前自己在学习C语言时,都是在VS ,KEIL这类windows下的IDE进行的。所以之前虽然也知道程序由代码转为可执行文件的过程,但是一直没有深刻的理解。最近在linux系统中进行了几次编程,只能使用toolchain进行编译,也因此对程序预编译-编译-链接过程终于有了一些概念。所以说IDE虽然好,但是会让人丧失很多深入学习的机会啊!好了,废话不说,下面开始正题。
1、预处理(Pre-Process):
也成预编译。又预处理器(预编译器)执行。总的来说就是讲一些技巧性的东西去掉或替换,为编译器留下纯粹的source。主要处理以下几种情况。
1)宏定义: 比如将代码中的PI换为3.14等等。如:
#define PI 3.14
#define GPIOJ0 *(volatile unsigned int*(0xE0002000))
2)include头文件。如:
#include <stdio.h>
#include "led.h"
3)将注释去掉后送给编译器
2、编译(Compile)
编译实际上就是将预处理过得.c, .s文件生成 .o文件的过程(中间还包括了汇编过程, .o文件已经是二进制代码了)。编译的进行是分立的。比如说在你的工程中有main.c, helloworld.c 甚至还有fxxk.s这种汇编文件。那么每一个source都会经过编译输出自己的.o文件。并且每一个source中的各个函数在各个.o文件中也是一块一块的。如下图所示。
所以说为什么我们编程时是以函数为单位的,因为编译时他也是以函数为单位的呀!每个函数都会编译成一个集体。
3、链接(link)
由链接器执行。至关重要的一步,将.o文件中各个函数段按照一定的顺序和规则累积叠加在一起,生成最后的可执行文件。拿上面的图片说话,可能会生成如下顺序。
4、总结
如果那做菜来比喻,预处理就像是洗菜,编译就像是把各种材料切好了放在菜板上,而链接就是把各部分材料按照顺序下锅的过程。最后炒出来一盘可以吃的菜,就是我们的可执行文件啦!