GCC编译器的使用总结

 

gcc对C语言的编译过程

gcc对C语言的编译过程分为4个阶段:预处理(Preprocess)、编译(Compilation)、汇编(Assembly)和链接(Linking)

预处理(Preprocess)

预处理就是对源程序中的伪指令,如以“#”开头的指令和一些特殊的符合处理过程,伪指令包括宏定义指令、条件编译指令和头文件包含指令。gcc对源程序进行预处理后会输出".i"文件。

预处理主要处理那些源代码中以“#”开始的预编译指令:

  • 所以的 #define 删除,替换为所有的宏定义
  • 处理所有的条件编译指令,如 #if #ifndef  #ifdef 等
  • 处理 #include 预处理指令,将包含的文件插入该预编译指令的位置。该过程递归进行,将被包含的文件可能还包含其他文件
  • 删除所以的注释
  • 添加行号和文件标识,以便于编译时编译器产生调试用的行号信息以及编译时产生编译错误或警告时能够显示行号信息
  • 保留所有的 #pragma 编译器指令,因为编译器需要使用它们
gcc -E object.c -o object.i

通过上面的命令,将目标文件进行预编译,“-E"告诉gcc编译器进行预编译,输出“.i”文件,是一个经过预处理的后的C代码文件。

编译(Compilation)

编译是将预处理文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件,在使用gcc编译时,默认情况下,不输出这个汇编代码文件。如果有需要通过单独的输入指令:

gcc -S object.i -o object.s

"-S"告诉gcc只进行到编译阶段,“object.i"是预编译阶output,编译生成”object.s"文件,里面包含的是汇编语言文件,汇编语言是通用编程语言,用助记符代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。

汇编(Assembly)

汇编是将汇编代码转变为机器可以执行的二进制代码,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表映射翻译即可。

gcc -c object.s -o object.o

"-c"告诉gcc只进行汇编处理,“object.s"是编译的结果也是汇编的源文件,汇编生成”object.o"文件,是一个二进制文件(windows 上通常是obj文件)

hexdump object.o

使用以上命令查看文件内容。

链接(Linking)

链接主要解决多个文件之间符合引用的问题(symbol resolution),编译时编译器只对单个文件进行处理,如果该文件里面需要引用到其他文件中的符合,那么这时文件中的符号的地址没法确定,只能等链接器把所有的目标文件连接在一起才能得到最终的地址,最终生成可执行文件,当所有的目标文件都生成之后,gcc就在内部调用链接器ld来完成链接工作。在链接时,所有的目标文件被安排在可执行程序中的恰当位置。

gcc编译器简介

Linux系统下的gcc(GNU C Compiler)时GNU推出的功能强大、性能优越的多平台编译器,是GNU代表之一。gcc是可以在多种硬件平台上编译出可执行程序的超级编译器,其执行效率比一般比一般编译器高出20%~30%,其功能强大且开源。

猜你喜欢

转载自blog.csdn.net/u012785169/article/details/89525359