C++从源文件到执行文件的过程

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

猜你喜欢

转载自blog.csdn.net/u013635579/article/details/82564237
今日推荐