编译过程
编译过程分三步:预编译、编译、汇编,编译之后链接生成可执行文件。
- 首先对源文件进行预处理。(如宏、#include、预编译指令#ifdef等) 生成.i文件,这个过程也叫做预编译(Processing)。
- 然后进行编译,这个过程主要是进行词法分析、语法分析和语义分析等,生成.s的汇编文件。
- 最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重定位的二进制目标文件,生成.o文件。
- 现代的编译器将一个源代码文件编译成一个未链接的目标文件,然后由链接器最终将这些目标文件链接起来形成可执行文件。
链接包括两种方式:静态链接和动态链接。
静态链接
静态链接将链接文件打包成在项目下的.o文件,在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
静态链接是将程序中使用的库文件的代码编译进程序本身,生成一个单独的可执行文件。这意味着程序在运行时不需要依赖外部库文件。
特点:
- 静态库对函数库的链接是放在编译时期完成的。
- 程序在运行时与函数库再无瓜葛,移植方便。
- 浪费空间和资源。因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
动态链接
动态链接将程序中使用的库文件的代码编译成独立的库文件,在程序运行时再进行链接。这样,多个程序可以共享同一个库文件,减少了重复代码的占用空间
特点:
- 共享一个副本
- 更新比较方便。更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。