在Linux操作系统中,编写C/C++的代码时经常需要使用gcc这款强大的编译器。
gcc是GNU C Compiler的意思,经过多年的发展,从一开始只支持C语言的编译到了今天可以支持数种编程语言的编译,包括C++、Java、Objective-C、Pascal语言等等,其功能已经从GNU C Compiler 变成了 GNU Compiler Collection。
以下通过一幅图来了解一下gcc的工作流程和常用参数。
(说明:.c文件是指以.c为后缀的文件)
gcc编译器编译C语言程序时,有.c文件到可执行文件一共经历4个步骤,包括:预处理、编译、汇编和链接。
1、预处理(preprocessing)
预处理阶段把.c源文件处理输出为.i文件,其效果是:把.c文件中的一些头文件展开等。
-E参数可以使gcc编译器在编译程序的时候在预处理过后停止,并输出所对应的.i文件,如上图所指。
2、编译(complication)
编译阶段后输出.s文件,.s文件里包含的是汇编指令。
-s参数可以使gcc编译器在编译程序的时候在编译处理后停止,并输出对应的.s文件。
3、汇编(assembly)
汇编阶段后输出.o目标文件。
-c参数可以使编译过程在输出.o目标文件后停止,并不进行链接。
4、链接(linking)
链接阶段把多个目标文件以及库文件链接起来,并生成最后可运行的执行文件。
在使用gcc编译器的过程中,除了以上常用的参数后,还有一个-o参数也是比较常用的。
-o参数的作用是指定输出文件,该参数不在乎所输出的文件是何种类型,无论是可执行文件、汇编文件、目标文件还是预处理后的C代码文件,但是只能有一个输出文件。所以,如果是多个源文件同时编译则不适用,但如果只需输出一个可执行文件就可以使用。
如 gcc -o test.c abctest,把test.c经过以上四个步骤后生成一个名为abctest的可执行文件;
如 gcc -c test.c -o abctest.o,把test.c经过前三个步骤生成一个名为abctest.o的目标文件。
gcc编译时还经常会加上-Wall 这个参数:
-Wall:输出gcc在编译过程中所遇到的所有warning,默认情况下是不输出的。
参考资料:http://www.shanghai.ws/gnu/gcc_1.htm