1.编译链接的目的
编译的目的是将C语言转换为计算机可以直接识别的语言,即机器语言(0和1)。众所周知,C语言是高级语言,它是由机器语言,汇编语言逐步演化而来,并非计算机可以直接识别。所以我们要将C语言转化为计算机可以识别的语言,就要进行编译和链接。
2.编译链接的过程
2.1 编译过程
预处理
通常用来处理带#的行和删除注释。
比如处理条件编译(#if、#ifdef、#ifndef、#else、#elif、#endif)、
替换宏定义(#define)、包含头文件(#include)等。
GCC的预处理命令如下:
gcc -E main.c > main.i
main.i
为预处理后的代码。
使用cat main.i
可以进行查看。
编译
将预处理后的文件进行词法分析、语义分析、语法分析及优化后生成的汇编代码。
GCC的编译命令如下:
gcc -S main.i -o main.s
main.s
同样可以用cat main.s
命令进行查看。
汇编
将编译生成的汇编语言转换为机器可以执行的语言。
GCC的汇编命令如下:
gcc -c main.s -o main.o
main.o
文件为二进制文件,可以用十六进制文件阅读器进行查看。
2.2 链接
将汇编生成的OBJ文件、系统的OBJ文件、库文件进行链接、最终生成可以在特定平台上可以运行的可执行程序。
GCC的链接命令如下:
gcc -o main main.o
main
为可执行文件。
在当前文件夹可以使用./main
进行执行。
事实上,在链接的过程中,可以根据开发人员指定的连接方式分为两种:
静态链接
静态链接将代码从静态链接库中被拷贝到最终的可执行程序中。执行文件比较大。
使用静态链接:gcc -static -o main main.o
动态链接
动态链接在链接阶段仅仅加入一些描述信息,而执行程序再从系统中把相应的动态库映射到进程的虚地址空间中。
默认使用动态链接:gcc -o main main.o