这个問题就是编译、运行的问题,在很多面试中都会遇到(今日头条的研发岗面试题就问到cpp文件是怎样运行起来的?)
在此详细说明C语言cpp嘚编译运行过程,CPP参考一下也就很容易明白了
首先放一张图,说明C语言cpp的运行过程
-
C语言cpp要想运行就要经过翻译环境,将 .c/.h 文件翻译成机器可以识别的机器码;
-
这个翻译过程可以分为编译和链接两个阶段;
-
编译:分为预编译、编译、汇编
预编译
是文件操作在这个阶段会进行#include头文件包含,注释删除#define标识符替换,宏定义替换
编译
是将源代码翻译成汇编代码,test.i → test.s
这个过程包含:词法分析,语法分析语义分析,源代码优化代码生成和目标代码优化。
汇编过程是将汇编代码翻译成机器可以识别的二进制指令并形成符号表 test.s → test.o (目标文件)。
到这里编译环节就完了。接下来就是链接
- 链接阶段是符号表的合并和重定义。
生成a.out可执行文件
cpp文件的运行大致和C语言cpp相同,具体过程参考下图理解
cpp文件的翻译过程前期编译和C文件一样,区别在于链接过程不同在编译器把所有的.cpp文件都转变成.obj文件后,链接器把所有的静态链接库(.lib)文件和所有的.obj文件链接起来形成.exe文件最后运行.exe文件并在过程中会加载动态链接库(.dll)。
- 对于obj文件和EXE文件都是二进制表示的电脑都能识别,为什么还要进行链接转换呢
obj是源码编译文件,而exe是编译后的解释生成的文件
雖然都是二进制文件,但是计算机底层的一些原理导致无法执行obj