一、C++ 程序的编译过程主要包含四个步骤:
1、预处理阶段
将源代码中的预处理指令(如#include、#define等)处理后生成新的代码文件,同时生成一个名为“编译指令”的文件。也就是说处理以#开头的指令。
2、编译阶段
将经过预处理后的代码文件(如.cpp文件)翻译成汇编代码(.s文件),由编译器完成。编译器进行语法分析、语义分析等操作并且产生符号表。也就是将.cpp文件转换为汇编文件(.s)。
3、汇编阶段
将汇编代码翻译成机器可以执行的二进制代码(.o文件),由汇编器完成。汇编器依赖符号表中的信息来处理变量名和函数名,并将它们转化成地址。
4、链接阶段
汇编程序生成的目标文件,即.o文件,并不会立即执行,因为可能出现.cpp文件中的函数引用了另一个.cpp文件中定义的符合或者调用了某个库文件中的函数。那链接的目的就是将这些文件对应的目标文件连接成一个整体,从而生成可执行的程序.exe文件。
5、总结
程序编译需要经过预处理、编译、汇编和链接四个阶段,但大多数人习惯将前三个阶段统称为编译阶段,所以才有了程序要经过编译和链接后才能运行的说法。
二、链接分为两种,静态链接和动态链接
1、.dll文件和.lib文件
通常情况下,.lib是静态库文件的扩展名,.dll是动态库文件的扩展名。静态库文件和动态库文件都是库文件,它们都是一下预编译好的代码,能够为程序提供一定的功能支持,程序通过调用库文件中的函数来使用这些功能。
2、什么是动态库文件、以及静态库文件
(1)静态库文件(.lib)被完整地编译链接成静态库文件,它们与主程序一起构建成为可执行文件,需要把整个静态库文件地代码一起打包到可执行文件中,因此会增加可执行文件地大小。因为静态库代码被直接包含到可执行文件中,所以运行时不存在额外地依赖关系。
(2)动态库文件(.dll)存储着可在程序运行时加载地代码、数据和资源。动态库是可装载地,它们不会直接与主程序链接编译,而是在主程序运行时才被动态载入。动态链接允许多个程序共享同一个库,这样可以减小可执行文件的大小,也方便通一管理和更新库中的代码,但是,运行时会额外依赖库文件,如果机器上没有安装相应的库文件,程序则无法运行。
3、静态链接和动态链接
(1)静态链接:代码从其所在的静态链接库中拷贝到最终的可执行程序中,在该程序被执行时,这些代码会被装入到该进程的虚拟地址空间中。
(2)动态链接:代码被放到动态链接库或共享对象的某个目标文件中,链接程序只是在最终的可执行程序中记录了共享对象的名字等一些信息。在程序执行时,动态链接库的全部内容会被映射到运行时相应进行的虚拟地址的空间。
4、两者的优缺点
(1)静态链接:浪费空间,每个可执行程序都会有目标文件的一个副本,这样如果目标文件进行了更新操作,就需要重新进行编译链接生成可执行程序(更新困难);优点就是执行的时候运行速度快,因为可执行程序具备了程序运行的所有内容。
(2)动态链接:节省内存、更新方便,但是动态链接是在程序运行时,每次执行都需要链接,相比静态链接会有一定的性能损失。