1.整体的过程
#icluude<stdio.h>
int main()
{
printf("hello\n");
return 0;
}
上述代码的执行需要四个步骤:预编译(prepressing)、编译(compilation)、汇编(assembly)和链接(linking),如下图所示:
2.预编译
工作:处理源文件和头文件。
在linux下的指令为:
gcc -E hello.c -o hello.i
预编译阶段处理‘#’开始的预编译指令:
a)将所有的#define删除,并展开宏定义;
b)处理所有预编译指令,如“#if”,“#endif”等;
c)处理#include预编译指令,将被包含的文件插入到预编译指令的位置;
d)删除所有的注释,“//”和“/**/”;
e)添加行号和文件标识;
f)保留所有的#pragma编译器指令。
3.编译(最核心的过程)
工作:将处理后的高级语言文件转化为汇编代码文件。
汇编过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。
在linux下的指令为:
gcc -S hello.i -o hello.s
4.汇编
工作:将汇编代码文件转换成相应的二进制代码(机器指令)文件。或者说是转换成机器语言。
在linux下的指令为:
gcc -c hello.s -o hello.o
预编译——汇编,一步到位的指令:
gcc -c hello.c -o hello.o
5.链接
功能:将需要的文件都给“连接”起来,最后才可以得到“a.out”文件。
库:预先编译好的方法的集合。
5.1静态链接
5.2动态链接
5.3静态库和动态库的对比
a)静态库中函数若被main调用之后,把静态库删除,main正常执行。
动态库需要一直存在,main才可以执行,删除则main不能执行;
b)调用静态库中的函数,直接拷贝到main函数中,而动态库只需要标记位置,所以动态库更节省空间。