Linux编程入门-gcc、make和gdb简介
欢迎来到Linux的编程世界!
如果你已是Windows下优秀的程序员,那么到了这里,你将会发现一个崭新的天地,虽然在Linux下编程比起在Windows下编程有种种的不便,但她的许多迷人之处一定会让你流连忘返-----只要你是一个真正"热爱"编程的程序员;如果你以前很少编程,只是刚刚迈进了这个大门,那么,你更是走对了地方,在这里,你会得到比MSDN更多的指引和帮助,你会迅速的成长为真正的程序员----如果你想成为的话。当然,这里最吸引人的,还应该是自由软件的精神。或许,在以后,你会把这里作为自己的家园。
要成为Linux下优秀的程序员,首先你要接触的便是gcc、make和gdb。如果你对微软的Visual系列开发工具有所了解的话,那么下面的等式会让你对它们有所了解,虽然并不是那么贴切:
gcc + make + gdb = Visual C ++
gcc(GNU cc)是一个编译器套件,它不仅能编译C、Objective C和C++程序,还能编译Fortran、Pascal等语言编写的程序。但就编译器而言,它是目前编译最快、效率最高的编译器,当然,这是非官方的说法。
make是一个项目管理工具。如果你早已习惯了敲F9、Ctrl+F9或者点击某个按钮来编译运行程序,那么,这个工具将会使你明白这一切如何发生的。
gdb(GNU DeBugger)是一个调试器,这对一个程序员是必不可少的。gdb的功能非常强大,但如果把友好的图形化的界面作为衡量的主要标准之一,那么现阶段在Linux下的确缺少好的调试器。xxgdb和kde下的Debugger正在这方面努力着。
和绝大多数教材、文章一样,我们从"Hello World!"开始。
我们先用vi或者其他一些图形化的编辑器生成一个hello.c文件:
#include
void main(void)
{
printf("Hello World!");
}
我们使用gcc进行编译:
gcc hello.c -o hello
就在当前目录下生成可执行文件hello,运行这个文件,你自然就会看到Hello World!的字样。这里hello.c是源文件,-o是编译选项,hello是你指定的文件名。要注意的是,不要使用test、help这类"常用"的名字来命名自己的可执行文件,他们往往早已被系统捷足先登了。
在程序中如果引用了其它的头文件,则需要用 -I路径名 选项告诉编译器在那里才能找到这些头文件。例如,在hello.c文件中有如下的两行:
#include
#include
其中myheadfile1.h在目录/usr/local/include目录下,myheadfile2.h在上一层目录下,则编译命令如下:
gcc -I/usr/local/include -I.. hello.c -o hello
程序中如果使用了不在默认库中的调用,例如,要在hello.c中调用pthread_create( )函数创建多线程,输入如下代码:
……
#include
……
pthread_create(t,attr,0,0);
……
使用上面的命令编译将出错:undefined reference to 'pthread_create'。这是因为没有告诉编译器在哪里能找到包含了名为pthread_create的调用。pthread_create在/usr/lib目录下的库文件libpthread.a(静态库)和libpthread.so(动态库)中。用 -L路径名 指定库的位置,用 -lFILE 指定库名为libFILE的静态或动态库。包含了pthread_create的hello.c的编译命令为:
gcc -L/usr/lib -lpthread hello.c -o hello
当程序为一个项目,包含很多文件时,可以先用 -c 选项编译生成目标文件,然后再用-o选项连接目标文件生成可执行文件。例如,项目的源文件为server.c 和 client.c,想生成名为 myapp 的可执行文件,则编译命令为:
gcc -c server.c
gcc -c client.c
gcc server.o client.o -o myapp
以上编译命令和下面的编译命令是等价的:
gcc client.c server.c -o myapp
当项目包含多个文件时,每一次敲入繁琐的编译命令大概会吓跑所有慕名到Linux下来开发的程序员们。这时,就该make来大显身手了。
make会在当前目录下寻找名为Makefile或makefile的文件,然后依次执行该文件。以前面的myapp为例:
myapp: server.o client.o
gcc server.o client.o -o myapp
server.o: server.c
gcc -c server.c
client.o: client.c
gcc -c client.c
其中,为键盘Tab键,不能用几个空格代替,即使它们看起来一样。第1、3、5行定义了依赖关系,第2、4、6行定义了相应的编译命令。make扫描1、3、5行,目标不存在则调用相应的命令行编译,若已经存在,则比较文件日期,若冒号后的文件新于冒号前的,同样重新编译。这样,如果用户仅仅修改了client.c一个文件,则用make重新编译时server.o就不会被重新编译,这样大大节省了时间。
千里之行,始于足下。这虽然只是一个简单的开始,但是,通向一个神秘殿堂的大门已经打开了,如何才能成为一个合格的程序员,一切都要靠努力,努力养成看文档、看How-to、看高手程序的好习惯,努力自己去动手实践,一切都会好起来的