一、C++从代码到可执行程序经历了什么?
(1)预编译:主要处理源代码文件中的以“#”开头的预编译指令。(预编译后形成 .i 文件)
处理规则见下:
删除所有的#define,展开所有的宏定义。
处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
删除所有的注释,“//”和“/**/”。
(2)编译:把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件。
(3)汇编:将汇编代码转变成机器可以执行的指令(机器码文件)。
汇编器的汇编过程相对于编译器来说更简单,没有复杂的语法,也没有语义,更不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译过来,汇编过程有汇编器as完成。经汇编之后,产生目标文件(与可执行文件格式几乎一样)xxx.o(Windows 下)、xxx.obj(Linux下)。
(4)链接:
将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。
链接分为静态链接和动态链接。
二、静态链接与动态链接:
静态链接:
函数和数据被编译进一个二进制文件。在使用静态库的情况下,在编译链接可执行