Makefile+GDB

来源:互联网 发布:好听的网络名字女生 编辑:程序博客网 时间:2024/05/30 22:42

GNUmake的主要功能是读进一个文本文件makefile并根据makefile的内容执行一系列的工作。

makefile的默认文件名为GNUmakefile、makefile或Makefile,当然也可以在make的命令行中指定别的文件名。

如果不特别指定,make命令在执行时将按顺序查找默认的makefile文件。多数Linux程序员使用第三种文件名Makefile。因为第一个字母是大写,通常被列在一个目录的文件列表的最前面。

Make–f  <filename>:它的作用是告诉make命令将哪个文件作为makefile文件。


一个Makefile文件主要含有一系列的规则,每条规则包含以下内容。

一个目标(target),即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”。

一个或多个依赖文件(dependency)列表,通常是编译目标文件所需要的其他文件。

 一系列命今(command),是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为TAB字符。

目标:目标文件1 目标文件2 。。。

<tab>    gcc  -o欲建立的执行文件     目标文件1   目标文件2 。。。

Makefile中的#表示注释
<tab>要在命令行的第一个字符
目标文件与相关文件之间需以“:”隔开。
如下:

# 以#开头的为注释行

test:a.o b.o

  gcc –o test a.o b.o

 a.o:a.c a.h e.h

  gcc –c a.c –o a.o

 b.o:b.c b.h

  gcc –c b.c –o b.o

 clean:

  rm –f *.o

目标从每行的最左边开始写,后面跟一个冒号(:),如果有与这个目标有依赖性的其他目标或文件,把它们列在冒号后面,并以空格隔开。然后另起一行开始写实现这个目标的一组命令。在Makefile中,可使用续行号(\)将一个单独的命令行延续成几行。但要注意在续行号(\)后面不能跟任何字符(包括空格和键)。

一般情况下,调用make命令可输入:

# make target

target是Makefile文件中定义的目标之一,如果省略target,make就将生成Makefile文件中定义的第一个目标。对于上面Makefile的例子,单独的一个“make”命令等价于:

# make test

 因为test是Makefile文件中定义的第一个目标,make首先将其读入,然后从第一行开始执行,把第一个目标test作为它的最终目标,所有后面的目标的更新都会影响到test的更新。第一条规则说明只要文件test的时间戳比文件a.o或b.o中的任何一个旧,下一行的编译命令将会被执行。

Makefile里的变量就像一个环境变量。事实上,环境变量在make中也被解释成make的变量。这些变量对大小写敏感,一般使用大写宇母。几乎可以从任何地方引用定义的变量,变量的主要作用如下:

1.保存文件名列表。

2.保存可执行命令名

3.保存编译器的参数

Makefile中的变量是用一个文本串在Makefile中定义的,这个文本串就是变量的值。只要在一行的开始写下这个变量的名字,后面跟一个“=”号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:

VARNAME=string

使用时,把变量用括号括起来,并在前面加上$符号,就可以引用变量的值:

      ${VARNAME}

如下:

OBJS=a.o b.o

  CC=gcc

   test:${ OBJS }

  ${CC } –o test ${ OBJS }

  a.o:a.c a.h e.h

  ${CC } –c a.c –o a.o

  b.o:b.c b.h

  ${CC } –c b.c –o b.o

   clean:

  rm –f *.o


GDB调试器

     Linux系统中包含了GNU调试程序gdb,它是一个用来调试C和 C++ 程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。gdb 所提供的一些功能如下所示:

1、运行程序,设置所有的能影响程序运行的参数和环境;
2、控制程序在指定的条件下停止运行;
3、当程序停止时,可以检查程序的状态;
4、修改程序的错误,并重新运行程序;
5、动态监视程序中变量的值;
6、可以单步执行代码,观察程序的运行状态

gdb程序调试的对象是可执行文件,而不是程序的源代码文件。

在执行gcc指令编译程序时,加上-g参数,指定程序在编译时包含调试信息。

gdb 利用这些信息使源代码和机器码相关联。


用下面的方式来运行gdb:

  gdb filename

其中,filename是要调试的可执行文件。用这种方式运行gdb可以直接指定想要调试的程序。这和启动gdb后执行file filename命令效果完全一样。也可以用gdb去检查一个因程序异常终止而产生的core文件,或者与一个正在运行的程序相连。

  gdb支持很多的命令且能实现不同的功能。这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令, 下面列出了在使用gdb 调试时会用到的一些命令。

1)file命令:装入想要调试的可执行文件。

2)cd命令:改变工作目录。

3)pwd命令:返回当前工作日录。

4)run命令:执行当前被调试的程序。

5)list命令:列出正在调试的应用程序的源代码。

6)break命令:设置断点。

7)next命令:执行下一条源代码,但是不进入函数内部。也就是说,将一条函数调用作为一条语句执行。执行这个命令的前提是已经run,开始了代码的执行。

8)step命令:执行下一条源代码,进入函数内部。如果调用了某个函数,会跳到函数所在的代码中等候一步步执行。执行这个命令的前提是已经用run开始执行代码。

9)display命令:在应用程序每次停止运行时显示表达式的值。

10)infobreak命令:显示当前断点列表,包括每个断点到达的次数。

11)infolocal命令:显示当前函数的所有局部变量的信息

12)print命令;显示表达式的值。

13)delete命令:删除断点。指定一个断点号码,则删除指定断点。不指定参数则删除所有的断点。

14)Shell命令:执行LinuxShell命令。

15)回车 : 表示重复上一条命令

16)Quit命令:退出gdb。











原创粉丝点击