# 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 void main(void){long long int var = 1;printf("It is not standard C code!n");}
下面来看看GCC是如何帮助程序员来发现这些错误的 。当GCC在编译不符合ANSI/ISO C语言标准的源代码时,如果加上了-pedantic选项,那么使用了扩展语法的地方将产生相应的警告信息:
# gcc -pedantic illcode.c -o illcodeillcode.c: In function `main":illcode.c:9: ISO C89 does not support `long long"illcode.c:8: return type of `main" is not `int"
需要注意的是,-pedantic编译选项并不能保证被编译程序与ANSI/ISO C标准的完全兼容,它仅仅只能用来帮助Linux程序员离这个目标越来越近 。或者换句话说,-pedantic选项能够帮助程序员发现一些不符合ANSI/ISO C标准的代码,但不是全部,事实上只有ANSI/ISO C语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告 。
除了-pedantic之外,GCC还有一些其它编译选项也能够产生有用的警告信息 。这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使GCC产生尽可能多的警告信息:
# gcc -Wall illcode.c -o illcodeillcode.c:8: warning: return type of `main" is not `int"illcode.c: In function `main":illcode.c:9: warning: unused variable `var"
GCC给出的警告信息虽然从严格意义上说不能算作是错误,但却很可能成为错误的栖身之所 。一个优秀的Linux程序员应该尽量避免产生警告信息,使自己的代码始终保持简洁、优美和健壮的特性 。
在处理警告方面,另一个常用的编译选项是-Werror,它要求GCC将所有的警告当成错误进行处理,这在使用自动编译工具(如Make等)时非常有用 。如果编译时带上-Werror选项,那么GCC会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改 。只有当相应的警告信息消除时,才可能将编译过程继续朝前推进 。执行情况如下:
# gcc -Wall -Werror illcode.c -o illcodecc1: warnings being treated as errorsillcode.c:8: warning: return type of `main" is not `int"illcode.c: In function `main":illcode.c:9: warning: unused variable `var"
对Linux程序员来讲,GCC给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是跟踪和调试程序的有力工具 。建议在用GCC编译源代码时始终带上-Wall选项,并把它逐渐培养成为一种习惯,这对找出常见的隐式编程错误很有帮助 。
库依赖
在Linux下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能 。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so或者.a)的集合 。虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下,但并不是所有的情况都是这样 。正因如此,GCC在编译时必须有自己的办法来查找所需要的头文件和库文件 。
推荐阅读
- Linux上安装GCC编译器过程
- Linux精彩桌面 GNOME桌面主题安装实例
- 【体验精彩】诺基亚6681最新详细评测之初印象
- 低端也精彩
- 逼真立体声的精彩 酷机康佳M929评测手记
- 父母在儿子婚礼上的精彩讲话稿
- 海尔V280,绝色纤薄,百万精彩
- 关于Linux操作系统下GCC的使用方法说明
- Linux系统平台下关于GCC编译及使用的方法
- S文手记:移动互联 精彩体验--海尔 V8800