gcc基础

发布时间:2009/05/01      类别:linux编程 | 所属专题:

版权所有,转载请注明:本文出自学与思编程网

GNU Compiler Collection简称GCC,它是由FSF开发的编译器工具集,能够编译C,C++,JAVA,Pascal,Fortran等多种语言编写的程序,它是Linux下使用最广泛的编译工具,也是我们在Linux平台下做开发的基础,因此我们有必要熟悉其使用。本文将以C语言为例根据日常开发过程中所需和常见的一些GCC使用作一个详细的介绍。

GCC在编译程序时要经历预处理,编译,汇编和连接四个阶段,虽然我们在这里简单的说是 gcc进行了这四个步骤,但需要明白的是gcc自己其实只进行了第二步的编译动作,其它几步都是借助于它人之力完成的,比如它会在预处理阶段调用预处理程序cpp完成预处理工作,在汇编阶段调用汇编器as,在最后连接阶段会调用连接程序ld完成连接工作等等。

预处理阶段

预处理阶段主要处理#include和#define,它把#include包含进来的.h 文件插入到#include所在的位置,把源程序中使用到的用#define定义的宏用实际的字符串代替,我们可以用-E选项要求gcc只进行预处理而不进行后面的三个阶段,如命令gcc -E hello.c -o hello.i,gcc就会对hello.c进行预处理生成hello.i,命令中的-E告诉gcc只进行预处理,-o选项告诉gcc输出文件为 hello.i,当然我们可以指定hello.i为其它名字,如test.i,但后缀名最好为.i因为这是一个约定俗成,如果我们省略上面命令中的-o hello.i则gcc也会根据输入文件hello.c把输出文件命名为hello.i

编译阶段

编译阶段是最重要的阶段,在这个阶段GCC首先检查语法然后把由上步生成的*.i编译成*.s文件。我们可以用如下命令告诉gcc进行这一步处理,gcc -S hello.i -o hello.s,-S选项告诉gcc把hello.i编译成.s文件;

上面这两步的输出文件都是文本文件,我们可以用诸如cat的文本处理等命令阅读这些输出文件。

汇编阶段

汇编阶段把*.s文件翻译成二进制机器指令文件*.o,如命令gcc -c hello.s -o hello.o,其中-c告诉gcc进行汇编处理。这步生成的文件是二进制文件,直接用文本工具打开看到的将是乱码,我们需要反汇编工具如GDB的帮助才能读懂它;

<p class=”no-ident”><strong>连接阶段</strong></p>

最后就是连接阶段,gcc在这个阶段把所有的*.o文件连接成一个可执行文件。如命令gcc hello.o -o hello,gcc就会把hello.o文件与所需的标准库中的.o文件连接成hello这个可执行程序。

虽然我们上面看到了gcc在编译我们的程序时经历了4个主要阶段,但平时大多数时候我们不需要这么一步一步的来浪费时间,我们只需要下达gcc -c hello.c -o hello就可以完成上述4个步骤,再要注意的是如果有多个源程序文件,gcc会对每个源程序分别执行前面3步形成对应的.o文件,然后再把这些.o文件连接在一起形成一个可执行程序。比如,gcc -c hello.c test.c -o hello命令,gcc首先把hello.c编译成hello.o,然后把test.c编译成test.o,最后再把二者和需要的标准库连接在一起形成 hello这个程序。

GCC常用选项

gcc有大量的选项可用,但平时我们使用最多的选项可不是很多,下面对这些常用选项作个简要的说明。

-o output-file 选项指定输出文件名,这个选项不是必须的,如果不指定输出文件名gcc会根据当前的操作选取默认的文件名。

-c 选项告诉编译器进行编译,看情况决定是否进行连接。不如命令gcc -c hello.c -o hello.o则不会进行连接步骤,而gcc -c hello.c -o hello则包含最后的连接。

-Idir 选项告诉编译器把dir这个路径加入到头文件搜索目录列表中。

-Ldir 选项告诉编译器把dir这个路径加入到库文件搜索目录列表中。

-lFOO 指定连接名为libFOO的库,比如在编写多线程程序时,我们除了在源代码中#include<pthread.h>外,编译时还须指定-lpthread,让gcc连接libpthread库中的函数。

-g 选项告诉gcc在可执行文件中包含标准调试信息。

-ggdb 选项告诉gcc在可执行程序中包含只有gdb才认识的调试信息。这个选项和上面那个-g选项在开发过程中可能很重要,因为我们写的程序难免要出问题,如果我们编译时指定了这两个选项之一,用gdb调试起来就方面多了。但一般在发布程序时我们不用这两个选项,它们会增加程序的大小。

-On 选项,其中n是一个数字,取值范围为0<=n<=3,常用的是-O1和-O2其中-O1种的1可以省略。在发布程序时用这个选项可以多多少少提高程序运行速度和减小程序的体积。

-Wall 选项让gcc打印所有的警告信息,平时我们编译程序应该始终指定此选项。我们应该尽量让我们的程序在此选项监督下编译而没有任何警告信息。

-static 连接静态库,默认情况下gcc会寻找动态库进行连接,我们一般没有必要指定这个选项,它会增加程序的大小。

本文对gcc做了一个简要的介绍,下一篇文章我们讨论gcc对C语言的部分扩展

版权所有,转载请注明:本文出自学与思编程网

发表评论