介绍
GCC(GNU Compiler Collection,GNU编译器集合)是一套由GNU工程开发的支持多种编程语言的编译器。GCC是自由软件发展过程中的著名例子,由自由软件基金会以GPL协议发布。
GCC支持多种语言,C/C++、Fortran、Ada等。
GCC是大多数类Unix操作系统(如Linux、BSD、Mac OS X等)的标准的编译器,GCC同样适用于微软的Windows。GCC支持多种计算机体系芯片,如x86、ARM,并已移植到其他多种硬件平台。Windows下的GCC平台为MinGW Developer Studio。但以下过程均为Linux上的描述。
GCC编译过程
首先,需要了解GCC编译程序的过程一般分为四个主要的阶段。
GCC编译程序的四个阶段
GCC编译程序的过程可以分成四个阶段:预处理、编译、汇编、链接。前三个阶段应用于单独的源文件,生成该文件对应的.o文件;而最后的链接阶段则将所有的目标文件结合生成一个可执行文件。
这四个阶段对应的操作如下所示:
#预处理,生成.i文件
gcc -E test.c -o test.i
#编译,生成.s文件
gcc -S test.i -o test.s
#汇编,生成.o文件
gcc -c test.s -o test.o
#链接,生成可执行文件
gcc test.o -o test
在Linux系统上,文件名后缀不起关键作用,但是对于GCC编译器则不同,GCC编译器会根据文件后缀名来认知文件的类型!-[ESco]作为编译器的全局开关,控制着最终输出的文件的类型,可以看做“编译路径”的终点,而GCC处理对象文件的后缀则决定着“编译路径”的起点,可见下图:
在将汇编文件的后缀.s改为.i后,我再想用GCC编译器处理它,用-S开关控制输出的类型为中间目标文件.o,就会出错,因为GCC会再次对.i文件进行编译,这个.i文件原本就是.s文件改名而来,是经过了编译阶段的,再编译一次,当然会出错!
所以,文件的后缀名对于GCC而言是及其重要的,下面来了解下。
GCC涉及的文件后缀名(suffix)
整理了一下,暂且这些:
.a为后缀的文件,是由目标文件构成的档案库文件; .C,.cc或.cxx 为后缀的文件,是C++源代码文件; .h为后缀的文件,是程序所包含的头文件; .i 为后缀的文件,是已经预处理过的C源代码文件; .ii为后缀的文件,是已经预处理过的C++源代码文件; .m为后缀的文件,是Objective-C源代码文件; .o为后缀的文件,是编译后的目标文件; .s为后缀的文件,是汇编语言源代码文件; .S为后缀的文件,是经过预编译的汇编语言源代码文件。 .c为后缀的文件,C语言源代码文件;
基本用法
gcc [options] [filename]
options既包括如上节所说的全局选项[ESco],也包括局部选项,见下:
-g:保留调试信息
-O:优化编译、链接过程,使产生的可执行文件执行效率高;但会降低编译和链接的速度
-O2:较-O更进一步,编译出的文件执行效率更高,但编译和链接的速度较-O时更慢
-Wall:打开编译告警