第三讲 GDB+Makefile

上传人:无*** 文档编号:244960434 上传时间:2024-10-06 格式:PPT 页数:35 大小:873KB
返回 下载 相关 举报
第三讲 GDB+Makefile_第1页
第1页 / 共35页
第三讲 GDB+Makefile_第2页
第2页 / 共35页
第三讲 GDB+Makefile_第3页
第3页 / 共35页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Makefile+GDB,2011-03-09,make,当执行make时,make会在当前目录下搜索Makefile(或makefile)文件,Makefile中记录了源码如何编译的详细信息。Make会自动识别源码是否经过变动,自动更新执行文件。,简化编译时所需要执行的命令,若在编译完成之后,修改了某个源码文件,则,make,仅会针对被修改的文件进行编译,其他的目标文件不会更改,最后可根据依赖性来更新执行文件,Make makefile,准备工作,要使用,make,,必须编写一个叫做,Makefile,的文件,这个文件描述了软件包中文件之间的关系,提供更新每个文件的命令。一般在一个软件包里,通常是可执行文件靠目标文件来更新,目标文件靠编译源文件来更新。,Makefile,写好之后,每次改变了某些源文件,只要执行,make,命令:,#make,所有必要的重新编译将执行。,Make,程序利用,makefile,中的数据和每个文件的最后修改时间来确定那个文件需要更新,对于需要更新的文件,,make,程序执行,makefile,数据中定义的命令来更新。,GNU make,的主要功能是读进一个文本文件,makefile,并根据,makefile,的内容执行一系列的工作。,makefile,的默认文件名为,GNUmakefile,、,makefile,或,Makefile,,当然也可以在,make,的命令行中指定别的文件名。,如果不特别指定,,make,命令在执行时将按顺序查找默认的,makefile,文件。多数,Linux,程序员使用第三种文件名,Makefile,。因为第一个字母是大写,通常被列在一个目录的文件列表的最前面。,Make f :,它的作用是告诉,make,命令将哪个文件作为,makefile,文件。,一个,Makefile,文件主要含有一系列的规则,每条规则包含以下内容。,一个目标(,target,),即,make,最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“,clean”,。,一个或多个依赖文件(,dependency,)列表,通常是编译目标文件所需要的其他文件。,一系列命今,(command),,是,make,执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为,TAB,字符。,Makefile,规则,目标:目标文件,1,目标文件,2,。,gcc -o,欲建立的执行文件 目标文件,1,目标文件,2,。,Makefile,中的,#,表示注释,要在命令行的第一个字符,目标文件与相关文件之间需以“:”隔开,#,以,#,开头的为注释行,test,:,prog.o code.o,gcc o test prog.o code.o,prog.o,:,prog.c prog.h code.h,gcc c prog.c o prog.o,code.o,:,code.c code.h,gcc c code.c o code.o,clean,:,rm f*.o,上面的,Makefile,文件中共定义了四个目标:,test,、,prog.o,、,code.o,和,clean,。目标从每行的最左边开始写,后面跟一个冒号(:),如果有与这个目标有依赖性的其他目标或文件,把它们列在冒号后面,并以空格隔开。然后另起一行开始写实现这个目标的一组命令。在,Makefile,中,可使用续行号(,)将一个单独的命令行延续成几行。但要注意在续行号(,)后面不能跟任何字符(包括空格和键)。,一般情况下,调用,make,命令可输入:,#make target,target,是,Makefile,文件中定义的目标之一,如果省略,target,,,make,就将生成,Makefile,文件中定义的第一个目标。对于上面,Makefile,的例子,单独的一个“,make”,命令等价于:,#make test,因为,test,是,Makefile,文件中定义的第一个目标,,make,首先将其读入,然后从第一行开始执行,把第一个目标,test,作为它的最终目标,所有后面的目标的更新都会影响到,test,的更新。第一条规则说明只要文件,test,的时间戳比文件,prog.o,或,code.o,中的任何一个旧,下一行的编译命令将会被执行。,但是,在检查文件,prog.o,和,code.o,的时间戳之前,,make,会在下面的行中寻找以,prog.o,和,code.o,为目标的规则,在第三行中找到了关于,prog.o,的规则,该文件的依赖文件是,prog.c,、,prog.h,和,code.h,。同样,,make,会在后面的规则行中继续查找这些依赖文件的规则,如果找不到,则开始检查这些依赖文件的时间戳,如果这些文件中任何一个的时间戳比,prog.o,的新,,make,将执行“,gcc c prog.c o prog.o”,命令,更新,prog.o,文件。,以同样的方法,接下来对文件,code.o,做类似的检查,依赖文件是,code.c,和,code.h,。当,make,执行完所有这些套嵌的规则后,,make,将处理最顶层的,test,规则。如果关于,prog.o,和,code.o,的两个规则中的任何一个被执行,至少其中一个,.o,目标文件就会比,test,新,那么就要执行,test,规则中的命令,因此,make,去执行,gcc,命令将,prog.o,和,code.o,连接成目标文件,test,。,在上面,Makefile,的例子中,还定义了一个目标,clean,,它是,Makefile,中常用的一种专用目标,即删除所有的目标模块。,.o,目标文件依赖,.c,源文件,,源码文件里一个简单改变都会造成那个文件被重新编译,并根据规则链依次由下到上执行编译过程,直到最终的可执行文件被重新连接。,Makefile,里的变量就像一个环境变量。事实上,环境变量在,make,中也被解释成,make,的变量。这些变量对大小写敏感,一般使用大写宇母。几乎可以从任何地方引用定义的变量,变量的主要作用如下:,1.,保存文件名列表。,2.,保存可执行命令名,3.,保存编译器的参数,Makefile,中的变量是用一个文本串在,Makefile,中定义的,这个文本串就是变量的值。只要在一行的开始写下这个变量的名字,后面跟一个“”号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:,VARNAME=string,使用时,把变量用括号括起来,并在前面加上,$,符号,就可以引用变量的值:,$VARNAME,make,解释规则时,,VARNAME,在等式右端展开为定义它的字符串。变量一般都在,Makefile,的头部定义。按照惯例,所有的,Makefile,变量都应该是大写。如果变量的值发生变化,就只需要在一个地方修改,从而简化了,Makefile,的维护。,OBJS=prog.o code.o,CC=gcc,test,:,$OBJS,$CC o test$OBJS,prog.o,:,prog.c prog.h code.h,$CC c prog.c o prog.o,code.o,:,code.c code.h,$CC c code.c o code.o,clean,:,rm f*.o,调试工具,GDB,GDB,调试器简介,Linux,系统中包含了,GNU,调试程序,gdb,,它是一个用来调试,C,和,C+,程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。,gdb,所提供的一些功能如下所示:,运行程序,设置所有的能影响程序运行的参数和环境;,控制程序在指定的条件下停止运行;,当程序停止时,可以检查程序的状态;,修改程序的错误,并重新运行程序;,动态监视程序中变量的值;,可以单步执行代码,观察程序的运行状态,gdb,程序调试的对象是可执行文件,而不是程序的源代码文件。,在执行,gcc,指令编译程序时,加上,-g,参数,指定程序在编译时包含调试信息。,gdb,利用这些信息使源代码和机器码相关联。,1,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,),info break,命令:显示当前断点列表,包括每个断点到达的次数。,11,),info local,命令:显示当前函数的所有局部变量的信息,12,),print,命令;显示表达式的值。,13,),delete,命令:删除断点。指定一个断点号码,则删除指定断点。不指定参数则删除所有的断点。,14,),Shell,命令:执行,Linux Shell,命令。,15,)回车:表示重复上一条命令,16,),Quit,命令:退出,gdb,。,#include,typedef struct,char data4096;,int key;,item;,item array=,bill,3,neil,4,john,2,rick,5,alex,1,;,sort(a,n),item*a;,int i=0,j=0;,int s=1;,for(;i n i+),s=0;,for(j=0;j aj+1.key),item t=aj;,aj=aj+1;,aj+1=t;,s+;,n-;,int s(item*a,int n),sort(a,n);,return 0;,int main(),int i;,s(array,5);,for(i=0;i 5;i+),printf(array%d=%s,%dn,i,arrayi.data,arrayi.key);,/*1 */typedef struct,/*2 */char data4096;,/*3 */int key;,/*4 */item;,/*5 */,/*6 */item array=,/*7 */bill,3,/*8 */neil,4,/*9 */john,2,/*10 */rick,5,/*11 */alex,1,/*12 */;,/*13 */,/*14 */sort(a,n),/*15 */item*a;,/*16 */,/*17 */int i=0,j=0;,/*18 */int s=1;,/*19 */,/*20 */for(;i n i+),/*21 */s=0;,/*22 */for(j=0;j aj+1.key),/*24 */item t=aj;,/*25 */aj=aj+1;,/*26 */aj+1=t;,/*27 */s+;,/*28 */,/*29 */,/*30 */n-;,/*31
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!