C语言程序的编译、链接具体过程及Linux环境下的具体实例
预处理阶段,预处理器主要做四部分工作,分别是:头文件展开、宏替换、去注释以及条件编译。
(1)头文件展开就是编译器会根据字符#开头的命令去读取相应的文件或者自定义文件, 并把相应的文件直接插入到当前程序代码中,这就完成了头文件的展开。(2)宏替换就是将程序员自定义的宏变量、宏函数等直接替换,如:#define size 10,在宏替换的过程中直接将代码中出现size的地方用10替换掉,不考虑类型、优先级等.
所以在定义和使用宏的时候程序员自己要注意这一问题,宏函数这里先不做具体解释。(3)去注释就是将代码中的注释部分直接减掉,简单易懂。(4)条件编译就是根据程员的思考及设计,对程序代码中的部分代码进行处理,配合宏定义语句使得满足条件或者不满足条件的代码直接个当做注释部分一样被裁减掉,具体看程序员自己的设计。
编译阶段就是将c语言转换成汇编语言的一个过程。汇编语言程序中的每条指令都以一种标准的文本格式确切的描述了一条低级机器语言指令。
汇编阶段就是将汇编语言就是将汇编语言翻译成机器语言指令的一个过程,由汇编器完成,处理完成之后得到一个二进制文件。
链接阶段由连接器负责完成,它将代码中调用的库函数、外部函数、程序员自己编写的函数等所有文件(经过汇编阶段完成后得到的二进制文件)处理成一个可执行文件,这就是链接阶段完成的。
linux环境下在程序的预处理、编译、汇编、链接的过程都可以用gcc的系列命令得到其文本文件,以hello world程序为例,当这个程序编写完成以后(假设命名为hello.c),用gcc -e hello.c -o hello.i 命令就可以得到一个预处理完成之后的文件,用编辑器打开就可得到前面所提到的头文件展开、宏替换、去注释、条件编译.
这四项工作完成以后的文件hello.i,而且可以清楚的看到原hello world程序的变化,然后用gcc -s hello.i -o hell.s 命令就可以得到一个全是汇编语言的文件hello.s,用文件编辑器打开可以看到一系列的汇编语言代码,再然后用gcc -c hello.s -o hello.o 命令就可以得到一个二进制文件hello.o,如果用编辑器打开会得到一堆乱码的文件,最后再用gcc hello.o -o hello 命令就得到一个可执行的文件hello,输入./hello之后就会在屏幕上显示hello world.
上一篇: Spring数据库事务的实现机制讲解