C++程序编译过程简介

编译过程主要分为4个过程  
1) 编译预处理  预编译程序完成的工做,能够说成是对源程序的“替换”工做。通过这个过程,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。
  • 宏定义命令;例如#define
  • 条件编译指令;例如#ifdef
  • 头文件包含指令;例如#include
  • 特殊符号;例如__LINE__,__FILE__
  • 预处理模块;例如#pragma
2) 编译、优化阶段:经过词法分析、语法分析,在确认全部的指令都符合语法规则以后,将其翻译成等价的中间代码或汇编代码。
在C++中,如下函数若是你没有定义可是被须要时,编译器会产生他们:默认构造函数、拷贝构造函数、析构函数、赋值运算符和一对取址运算符。

3) 汇编过程: 把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每个C语言源程序,都将最终通过这一处理而获得相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。

4) 连接程序 :将有关的目标文件彼此相链接,也即将在一个文件中引用的符号同该符号在另一个文件中的定义链接起来,使得全部的这些目标文件成为一个可以诶操做系统装入执行的统一总体
C++使用连接器以确保用到的函数都只被定义一次,以及确保static objects只被定义一次,会将咱们作了声明但却不曾定义的函数检测出来。
连接有静态连接和动态连接。

  • 静态连接:在这种连接方式下,函数的代码将从其所在地静态连接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态连接库其实是一个目标文件的集合,其中的每一个文件含有库中的一个或者一组相关函数的代码。     
  • 动态连接:在此种方式下,函数的代码被放到称做是动态连接库或共享对象的某个目标文件中。连接程序此时所做的只是在最终的可执行程序中记录下共享对象的名字以及其它少许的登记信息。在此可执行文件被执行时,动态连接库的所有内容将被映射到运行时相应进程的虚地址空间。动态连接程序将根据可执行程序中记录的信息找到相应的函数代码。


备注:头文件里咱们一般只放置声明而不是定义,由于头文件有可能被释放到多个源文件中,每一个源文件都会单独编译,这样连接时就会发现全局空间中有多个定义了。