Bootstrap

静态链接与动态链接、静态库与动态库、硬链接与软链接

一、C++从代码到可执行程序经历了什么?

(1)预编译:主要处理源代码文件中的以“#”开头的预编译指令。(预编译后形成 .i 文件)

处理规则见下:
  删除所有的#define,展开所有的宏定义。
  处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
  处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
  删除所有的注释,“//”和“/**/”。

(2)编译:把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件。

(3)汇编:将汇编代码转变成机器可以执行的指令(机器码文件)。
  汇编器的汇编过程相对于编译器来说更简单,没有复杂的语法,也没有语义,更不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译过来,汇编过程有汇编器as完成。经汇编之后,产生目标文件(与可执行文件格式几乎一样)xxx.o(Windows 下)、xxx.obj(Linux下)。

(4)链接:
  将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。
  链接分为静态链接和动态链接。

二、静态链接与动态链接:

静态链接:
  函数和数据被编译进一个二进制文件。在使用静态库的情况下,在编译链接可执行

;