linux环境下演示gcc编译过程分步编译命令作用指令预处理gcc -E hello.c -o hello.i编译gcc -S hello.i -o hello.s汇编gcc -c hello.s -o hello.o链接gcc hello.o -o hello_elf选项含义-E大写只进行预处理-S大写进行编译 将c程序转成汇编程序-c进行汇编将汇编代码转成机器代码-o file指定生成的输出文件名文件后缀含义.cc语言文件.i预处理后的c语言文件.s编译后的汇编文件.o编译后的目标文件源文件链接文件第一步预处理 处理伪指令和特殊符号gcc -E hello.c -o hello.i从执行结果可以看出预处理将源文件中头文件包含在程序中。预处理阶段主要进行一下工作1、宏定义指令宏定义又称为宏替换值用一个表达式替换另一个式子简称为宏2、条件指令条件指令可以使程序员通过定义不同的宏自由控制程序代码的执行执行那些代码跳过那些代码。预编译处理会将那些多余的代码去掉。3、头文件指令如#include stdio.h是指把相应的头文件包含至程序中包含头文件是为了包含头文件中系统定义的函数以便程序直接调用。4、特殊符号预编译的时候回检查是否有特殊符号如LINE和FILE都被当成特殊符号处理用适当的值来代替。源文件经过预编译处理后会变成一个没有宏定义头文件条件指令和特殊符号的文件这个文件与源文件的功能一样但是内容有所改变。第二步编译gcc -S hello.i -o hello.s编译把预编译得到的文件进行语法、语义分析等使之转化为功能等价的中间代码或者汇编代码。优化对代码进行优化减小代码的时间和空间提高执行效率。第三步汇编gcc -c hello.s -o hello.o汇编步骤中会将汇编代码转换成机器代码但是此时机器代码还不能执行还需要通过第四步链接才能生成可执行文件。第四步链接gcc hello.o -o hello_elf链接程序把彼此有关的目标文件都链接起来即把这些文件都联系成一个统一的整体转入机器的内存中使目标文件能够相互调用。