C++源码到二进制可执行文件的过程与C语言类似,包括四个过程:预编译、编译、汇编、链接
1、预编译
C/C++编译过程中的第一个阶段,主要目的是对源代码进行处理和准备工作。下面是预编译的主要步骤:
-
去除宏定义:将所有的 #define 删除,并展开所有的宏定义,将宏替换为具体的值或表达式。
-
处理条件预编译指令:对条件预编译指令进行处理,如 #if、#ifdef、#ifndef 等。根据条件判断结果,决定是否编译对应的代码块。
-
处理 #include 预编译指令:将被包含的文件插入到 #include 指令的位置。
-
过滤注释:将源代码中的注释部分去除,包括单行注释(//)和多行注释(/* … */)。
-
添加行号和文件名标识:为每一行添加行号和文件名标识,用于编译过程中的错误提示和调试。
预编译阶段主要包括宏展开、条件编译、头文件包含、注释过滤和标识添加等步骤,为后续的编译过程做好准备。
2、编译
1)词法分析+:将源代码的字符序列分割成一系列的记号,I
2)语法分析+:对记号进行语法分析,产生语法树+。
3)语义分析:判断表达式是否有意义。
4)代码优化
(5)目标代码生成+:生成汇编代码+
(6)目标代码优化
3、汇编
将汇编代码转变成机器可以执行的指令
4、链接
将不同的源文件产生的目标文件进行链接形成一个可以执行的程序。
(1) 静态链接:在链接的时候就已把要调用的函数链接到生成的可执行文件中。
把静态库删除也不会影响可执行程序执行。生成的静态链接库Windows下以 .lib 为后缀,Linux
下以 .a 为后缀。
(2) 动态链接:在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中去找要链接的函数
生成的可执行文件中没有函数代码,只包含函数的重定位信息。
当删除动态库时,可执行程序就不能运行。生成的动态链接库Windows下以 .dll 为后缀,Linux下以 .so 为后缀。