初识编译器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中写写程序,为开源事业也做出一点自己的贡献呢。