简述.c文件是怎样变成.exe文件的 其中包括源文件的预编译 编译 汇编 及链接

一 首言

        一句“Hello World”几乎是很多小伙伴接触编程的开始,但输出一句“Hello World”的背后却是编译器处理过数次的结果。

        现在的集成开发环境(IDE)已经非常智能和简洁,只要按下编译按钮等完成就得到执行程序了,其中的预编译 ,编译 ,汇编 及 链接并没有展示出来(如下图)。

         如果是多个源文件,则是分别进行预编译,编译,汇编后,在一起进行链接生成可执行程序(如下图)

二 预编译 编译 汇编 链接的具体作用 

2.1 预编译

        1:完成所以#define替换及删除

        2 :处理所以预编译指令,比如#if , #ifdef ,#endef等

        3:处理“#include"预编译指令,将被包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。
        4:删除所有的注释“//” 和“/* */”。
        5:添加行号和文件名标识,比如#2“ hello.c" 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号。
        6:保留所有的#pragma编译器指令,因为编译器须要使用它们。
总结:经过预编译后的 .i文件 不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件

 2.2 编译

        作用:对源代码进行语法分析,词法分析,语义分析及 优化后 生成相应的汇编代码文件(下一步是汇编所以需生成汇编代码)

2.3 汇编

        作用:将汇编代码转换成机器可以执行的指令

拓展:汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎 都对应一条机器指令。所以汇编器的汇编过程相对于编译器来讲比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表- --翻译就可以了, “汇编”这个名字也来源于此。

2.4 链接

        作用:地址和空间的分配,段表的合并,符号表的合并及重定位

拓展:

重定位:链接器修改的绝对存储地址(如变量的等)

猜你喜欢

转载自blog.csdn.net/ZhuGeBin26/article/details/128436849
今日推荐