C++文件编译过程主要为:
预处理->编译->汇编->链接
1. 预处理
处理以#开头的指令。
2. 编译
将每个源码.cpp文件编译成.s汇编代码,一个cpp文件编译成一个.s文件。
3. 汇编
将汇编语句.s文件翻译成机器指令.o文件,也就是一个.cpp文件对应一个.o文件。
4. 链接
汇编程序生成的目标文件,即.o文件,并不会立即生成exe文件,因为可能会出现.cpp文件中的函数引用了另一个文件中定义的符号或者调用了某个库文件中的函数。链接的目的就是将这些.cpp文件对应的.o文件连接成一个整体,从而生成可执行的程序.exe文件。
链接分以下两种方式:
- 静态链接:代码从静态库在链接阶段直接拷贝到最终的可执行程序中,在该程序被执行时,这些代码会被装入到该进程的虚拟地址空间中。
- 动态链接:代码被放到动态链接库或共享对象的某个目标文件中,链接程序只是在最终的可执行程序中记录了共享对象的名字等一些信息。在程序执行时,动态链接库的全部内容会被映射到运行时相应进行的虚拟地址的空间。
两者的优缺点为:
- 静态链接:浪费空间,每个可执行程序都会有目标文件的一个副本,这样如果目标文件进行了更新操作,就需要重新进行编译链接生成可执行程序(更新困难);优点就是执行的时候运行速度快,因为可执行程序具备了程序运行的所有内容。
- 动态链接:节省内存、更新方便,但是动态链接是在程序运行时,每次执行都需要链接,相比静态链接会有一定的性能损失。