点滴

IT博客 首页 新随笔 联系 聚合 管理
  103 Posts :: 81 Stories :: 50 Comments :: 0 Trackbacks
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、看高手程序的好习惯,努力自己去动手实践,一切都会好起来的
posted on 2006-12-21 21:06 天空 阅读(2397) 评论(1)  编辑 收藏 引用 所属分类: 骗子的linux学习

评论

# re: GCC 入门资料(四)(ZT) 2011-04-09 14:27 葫芦娃
写得好啊,通俗易懂  回复  更多评论
  

只有注册用户登录后才能发表评论。