初识编译器gcc

Linux之家

Linux永远同C语言联系在一起,不管你是C程序员还是普通的Linux爱好者,肯定知道C语言在Linux的地位。因为Linux操作系统本身几乎是用C语言编写的,而且我们还可以看到Linux的源代码。所以不管是谁,一旦用了Linux,总有亲手编写一个C程序的冲动。然而编写源程序之后,我们必须进行编译和连接,这个任务我们可以让gcc来完成。Linux下的gcc是GNU C的编译器。如果你想在Linux编写C程序,那么你就应该很好地了解一下gcc。

gcc编译的第一个程序

接下来我们来实际感受一下在Linux环境下编程的全过程:

1.如果你还处在Linux的图形化桌面中,那么你先进入系统工具中的“终端”。

2.打开vi或其它文本编辑器。

vi my_c.c

(其中my_c.c是源程序的文件名,可以根据自己的需要取。)

3.输入下面的源程序,然后保存。

main()

{

printf(“Hello Linux!\n”);

}

(注:vi的保存方法是先按Esc,然后输入“:qw”。)

4.用gcc编译连接。

gcc my_c.c

5.运行程序。

./a.out

(结果在屏幕上输出:Hello Linux!)

祝贺你,你已经成功地在Linux上开发了一个C语言程序!

接下来,我们较系统地了解一下gcc。

gcc的工作流程

用gcc编译C程序生成可执行文件,看起来好像是一步完成的,但实际上它要经历如下四个步骤:

1.预处理(Preprocessing):这一步需要分析各种命令,如#define,#include等。gcc调用cpp程序来完成。

2.编译(Compilation):这一阶段根据输入文件产生汇编语言。gcc调用cc1来完成。

3.汇编(Assembly):这一步将汇编语言用作输入,产生有.o扩展名的目标文件。gcc调用as来完成。

4.连接(Linking):这一阶段中,各目标文件.o被放在可执行文件的适当位置上,该程序引用的函数也放在可执行文件中(对使用共享库的程序稍有不同)。gcc调用连接程序ld来完成此任务。

gcc的基本用法

gcc -o prog main.c sub1.c sub2.c sub3.c

gcc可处理的文件

file.c:C源文件,被gcc预处理和编译

file.C:C++源文件,被gcc预处理和编译

file.cc:C++源文件,被gcc预处理和编译

file.cxx:C++源文件,被gcc预处理和编译

file.m:Objective C源文件,被gcc预处理、编译和汇编

file.i:预处理后的C源文件,被gcc编译

file.ii:预处理后的C++源文件,被gcc编译

file.s:汇编语言源文件,被as汇编

file.S:汇编语言源文件,被as预处理和汇编

file.o:编译后的目标文件,传送给ld

file.a:目标文件库,传送给ld

gcc经常使用的几个选项:

1.-c:只预处理编译和汇编程序,不进行连接。编译器对每一个源程序产生一个目标文件。

2.-o file:指定输出的可执行文件名为file。如果没有用-o选项,gcc就使用缺省的可执行文件名a.out(如上例)。目标文件和汇编文件的输出分别是source.o和source.s,预处理的C源程序的输出是标准输出stdout。

3.-O:对程序编译进行优化,编译程序试图减少被编译程序的长度和执行时间,但其编译速度比不作优化时慢,而且要求较多的内存。

4.-O2:允许比-O更好的优化,编译速度较慢,但结果程序的执行较快。

5.-g:产生一张用于调试和排错的扩展符号表。

6.-Ldir将dir目录加到搜寻-l选项指定的函数库文件的目录列表中去。Dir可使用相对路径。如-L../lib。

7.-static:禁止与共享函数库连接。

8.-shared:尽量与共享函数库连接。

实际上,个人觉得Linux下学C语言,通过gcc可以得到非常快的编译程序的速度,对于效率的提升是非常明显的,而且支持gcc的Linux编程工具也越来越多,大家为什么不试试在Linux中写写程序,为开源事业也做出一点自己的贡献呢。