在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是灵活运用C编译器.目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSIC标准的编译系统,能够编译用C、C++和Object C等语言编写的程序.GCC不仅功能非常强大,结构也异常灵活.最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等. 开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好 地控制整个编译过程.在使用GCC编译程序时,编译过程可以被细分为四个阶段: ◆ 预处理(Pre-Processing) ◆ 编译(Compiling) ◆ 汇编(Assembling) ◆ 链接(Linking) Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该 阶段的输出信息,或者对 最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试 做好准备.和其它常用的 编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码 . GCC提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性 .此外,GCC还对标准的C和 C++语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编 程的工作量. GCC起步 在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运 用到实际的项目开发中去. 首先用熟悉的编辑器输入清单1所示的代码: 清单1:hello.c #include <stdio.h> int main(void) { printf ("Hello world, Linux programming!\n"); return 0; } 然后执行下面的命令编译和运行这段程序: # gcc hello.c -o hello # ./hello Hello world, Linux programming! 此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它 应当被预处理的宏定义也 都做了相应的处理.下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成: # gcc -c hello.i -o hello.o GCC默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开 始执行编译过程,也可以 使用-x参数让GCC从指定的步骤开始编译.最后一步是将生成的目标文件链接成可执行文件 : # gcc hello.o -o hello 在采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组成的,相应地也 就形成了多个编译单元,使 用GCC能够很好地管理这些编译单元.假设有一个由foo1.c和foo2.c两个源文件组成的程序 ,为了对它们进行编译,并 最终生成可执行程序foo,可以使用下面这条命令: # gcc foo1.c foo2.c -o foo 如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行.如果深 究起来,上面这条命令大 致相当于依次执行如下三条命令: # gcc -c foo1.c -o foo1.o # gcc -c foo2.c -o foo2.o # gcc foo1.o foo2.o -o foo 在编译一个包含许多源文件的工程时,若只用一条GCC命令来完成编译是非常浪费时间的.假 设项目中有100个源文件 需要编译,并且每个源文件中都包含10000行代码,如果像上面那样仅用一条GCC命令来完成 编译工作,那么GCC需要将 每个源文件都重新编译一遍,然后再全部连接起来.很显然,这样浪费的时间相当多,尤其是 当用户只是修改了其中某 一个文件的时候,完全没有必要将每个文件都重新编译一遍,因为很多已经生成的目标文件 是不会改变的.要解决这个 问题,关键是要灵活运用GCC,同时还要借助像Make这样的工具. 警告提示功能 GCC包含完整的出错检查和警告提示功能,它们可以帮助Linux程序员写出更加专业和优美的 代码.先来读读清单2所示 的程序,这段代码写得很糟糕,仔细检查一下不难挑出很多毛病: ◆main函数的返回值被声明为void,但实际上应该是int; ◆使用了GNU语法扩展,即使用long long来声明64位整数,不符合ANSI/ISO C语言标准; ◆main函数在终止前没有调用return语句. 清单2:illcode.c #include <stdio.h> void main(void) { long long int var = 1; printf("It is not standard C code!\n"); |