c语言——编译的过程

        一个test.c的文件是如何产生我们想要的效果呢,最终是怎样生成一个test.exe可执行文件呢?

        test.c放的是c语言的源代码,经过翻译环境会变成二进制文件再经过运行环境产生出我们想要的结果。

c语言——编译的过程_第1张图片

        那这个翻译环境是怎样翻译的呢?翻译环境分成2个过程:编译、链接。c语言的源代码经过编译会生成 .obj 的目标文件,而目标文件与链接库经过链接器则会生成一个.exe可执行程序。

c语言——编译的过程_第2张图片

        编译又可以细分成:预编译也叫(预处理)、编译、汇编。

c语言——编译的过程_第3张图片        接下来用Linux下的gcc C语言编译器来演示程序的编译和链接的过程。

编译阶段:

        预编译:

                有2个文件:add.c 、test.c。经过预编译生成一个test.i的文件。c语言——编译的过程_第4张图片

         打开test.i文件一看为什么代码量很少的两个文件经过预处理后生成一个.i 的文件会突然变出很多内容呢?800多行。c语言——编译的过程_第5张图片

        不难发现,在test.c文件里有包stdio.h头文件,怎么到了.i 文件里就没了呢?其实是因为stdio.h头文件里面的内容被展开了,所以才导致了原本寥寥无几的内容突然剧增了。

        预处理阶段不单单是展开头文件,不仅会把注释替换成空格,相当于是删掉注释,因为注释是给人看的,编译器才不看注释;还会完成宏替换。

c语言——编译的过程_第6张图片

 编译

        编译阶段做了些什么呢?编译阶段会把c语言的源代码转换成汇编代码,并且会进行语法分析、词法分析、语义分析、符号汇总(文件里全局的函数符号进行符号汇总,把Add、main、printf等等一些函数符号名记录下来)。

 c语言——编译的过程_第7张图片

c语言——编译的过程_第8张图片

 汇编

         到了汇编这个阶段会把汇编代码转换成二进制指令、形成符号表。

c语言——编译的过程_第9张图片

        形成符号表是什么意思呢,就是给编译阶段汇总出来的符号进行地址分配然后形成符号表。

c语言——编译的过程_第10张图片
 链接 

        链接阶段会进行合并段表、符号表的合并和重定位。最终生成可执行程序。

c语言——编译的过程_第11张图片

 总结

c语言——编译的过程_第12张图片

 

 

 

 

        

        

        

你可能感兴趣的:(c语言)