
5.2 Linux下gcc编译器的使用方法
前面介绍了gcc编译器工作流程,讲解了它如何将一个编辑好的源程序文件编译成最终的可执行文件的过程。前面介绍了gcc编译流程主要有预处理、编译、汇编、链接四个步骤,如图5-7所示。这一小节我们需要掌握gcc编译器在Linux系统下的使用方法。

图5-7 gcc编译器编译过程
目前现有嵌入式Linux系统开发一般都会使用到交叉编译,而交叉编译工具链90%以上都会集成gcc编译器,这也是为什么我们要花费那么多篇幅来讲gcc编译器。对gcc编译器编译流程有一定的了解后,现在需要掌握gcc编译器在Linux系统中的使用方法。
gcc编译器在Linux系统下将一个.c源文件经过预处理、编译、汇编、链接四个步骤的命令后生成可执行文件,下面就是gcc编译器在Linux系统下编译文件的四条基本命令。

Linux系统下使用gcc编译器首先要能够认清文件的扩展名,其中表5-1为gcc编译器编译过程中常见的文件扩展名。
表5-1 gcc编译器常见的文件名称

gcc编译器使用gcc的专用命令将源程序文件编译成可执行文件。gcc的基本格式是gcc[选项][输入文件名][-o输出文件名],其中[选项]就是需要编译器执行的操作,比如预处理、编译等过程。[输入文件名]对应的是需要编译的文件,比如hello.c等。[-o输出文件名]一般是gcc编译阶段产生的中间文件类型,如hello.i、hello.s等。这里特别选择了gcc编译器常用的[选型]类型以及执行过程进行介绍。
1)[-c]:只是进行编译以及汇编而不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为扩展名的中间目标文件,通常用于编译不包含主程序的子程序文件,如图5-8所示。

图5-8 gcc-c选项
2)[-o输出文件名]:-o选型后面要跟着明确的输出文件名称,如果-o选项后没有紧跟着输出文件名称,gcc就输出默认的可执行文件a.out,如图5-9所示。

图5-9 gcc-o选项
3)[-E]:gcc编译器使用该选项可以对源文件进行预处理,生成预处理文件,一般把预处理文件扩展名定义为.i,如图5-10所示。

图5-10 gcc-E选项
4)[-S]:gcc编译器使用该选项可以将预处理文件编译为汇编代码,我们把汇编文件扩展名定义为.i,如图5-11所示。

图5-11 gcc-S选项
5)[-O/-O2]:对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是编译、链接的速度就相应地要慢一些。-O2比-O更好地优化编译、链接,整个编译、链接过程会更慢,如图5-12所示。

图5-12 gcc-O/-O2选项
gcc编译器常用的[选型]类型还有很多,比如,-shared主要是在生成共享库文件时使用,-Wall生成所有警告信息,-w不生成任何警告信息等,限于篇幅原因,感兴趣的读者可以继续研究其他[选型]类型。