您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > linux教程第04课_开发工具
操作系统与Linux实现第6章常用开发工具主要内容•gcc编译系统的概念和使用•gdb程序调试工具的概念和使用•程序维护工具make的概念和使用6.1gcc编译系统6.1.1文件名后缀文件名后缀文件类型文件名后缀文件类型.cC源文件.F.fpp.FPPFORTRAN源文件.i预处理后的C源文件.s汇编程序文件.ii预处理后的C++源文件.S必须预处理的汇编程序文件.mObjective-C源文件.o目标文件.mi预处理后的Objective-C源文件.a静态链接库.h头文件.so动态链接库.C.cc.cp.cpp.c++.cxxC++源文件6.1.2C语言编译过程1.预处理阶段预处理是常规编译之前预先进行的工作,故此得名。它读取C语言源文件,对其中以“#”开头的指令(伪指令)和特殊符号进行处理。主要包括文件包含、宏定义和条件编译指令。2.编译阶段•编译程序(Compiler)对预处理之后的输出文件进行词法分析和语法分析,试图找出所有不符合语法规则的部分3.汇编过程•汇编过程是汇编程序(Assembler)把汇编语言代码翻译成目标机器代码的过程4.连接阶段•连接程序(Linker)要解决外部符号访问地址问题•连接模式分为静态连接和动态连接6.1.3gcc命令行选项•在Linux系统中,C/C++程序编译命令是gcc•$gccf1.cf2.c(针对C语言源程序)执行完成后,生成默认的可执行文件a.out。1.预处理选项●几个预处理常用选项:-C-Dname-Dname=definition-Uname-Idir-ofile-E2.编译程序选项•gcc编译程序常用选项及其作用选项格式功能-c只生成目标文件,不进行连接。用于对源文件的分别编译-S只进行编译,不做汇编,生成汇编代码文件格式,其名与源文件相同,但扩展名为.s-ofile将输出放在文件file中。如果未使用该选项,则可执行文件放在a.out中-g指示编译程序在目标代码中加入供调试程序gdb使用的附加信息-v在标准出错输出上显示编译阶段所执行的命令,即编译驱动程序及预处理程序的版本号3.优化程序选项•优化程序常用的选项及其作用选项格式功能-O-O1试图减少代码大小和执行时间,但并不执行需要花费大量编译时间的任何优化-O2在-O1级别的优化之上,还进行一些额外调整工作——除不做循环展开、函数内联和寄存器重新命名外,几乎进行所有可选优化-O3除了完成所有-O2级别的优化之外,还进行包括循环展开和其他一些与处理器特性相关的优化工作-O0不执行优化-Os具有-O2级别的优化,同时并不特别增加代码大小4.连接程序选项•连接程序常用的选项及其功能选项格式功能object-file-name不以专用后缀结尾的文件名就认为是目标文件名或库名。连接程序可以根据文件内容来区分目标文件和库-c-S-E如果使用其中任何一个选项,那么都不运行连接程序,而且目标文件名不应该用做参数-llibrary连接时搜索由library命名的库。连接程序按照在命令行上给定的顺序搜索和处理库及目标文件。实际的库名是liblibrary,但按默认规则,开头的lib和后缀(.a或.so)可以被省略-static在支持动态连接的系统中,它强制使用静态链接库,而阻止连接动态库;而在其他系统中不起作用-Ldir把指定的目录dir加到连接程序搜索库文件的路径表中,即在搜索-l后面列举的库文件时,首先到dir下搜索,找不到再到标准位置下搜索-Bprefix该选项规定在什么地方查找可执行文件、库文件、包含文件和编译程序本身数据文件-ofile指定连接程序最后生成的可执行文件名称为file,不是默认的a.out6.2gdb程序调试工具•程序中的错误可按性质分为三种:(1)编译错误,即语法错误。(2)运行错误。(3)逻辑错误。查找程序中的错误,诊断其准确位置,并予以改正,这就是程序调试。程序调试分为人工查错与机器调试。6.2.1启动gdb和查看内部命令•为了发挥gdb的全部功能,需要在编译源程序时使用-g选项。如:$gcc-gprog.c-oprog(针对C语言源程序prog.c)•启动gdb的方法有以下几种:(1)直接使用shell命令gdb(2)以一个可执行程序作为gdb的参数(3)同时以可执行程序和core文件作为gdb的参数(4)指定一个进程号PID作为gdb的第二个参数6.2.2显示源程序和数据1.显示和搜索源程序(1)显示源文件•利用list命令可以显示源文件中指定的函数或代码行(2)模式搜索forward-searchregexpsearchregexpreverse-searchregexp2.查看运行时数据(1)print命令一般使用格式是:print[/fmt]exp(2)gdb所支持的运算符①{type}adrexp表示一个数据类型为type、存放地址为adrexp的数据。②@是一个与数组有关的双目运算符,使用形式如:•printarray@10printarray[3]@5③file::var(或者function::var)表示文件file(或者函数function)中变量var的值(3)输出格式•在print/fmtexp命令中,“/”之后的fmt是表示输出格式的字母,它由表示格式的字母和表示数据长度的字母组成。(4)whatis命令显示出变量的数据类型(5)x命令可以查看内存地址中数据的值。其使用格式是:x[/fmt]address(6)display命令可以预先设置一些要显示的表达式。其一般格式是:display[/fmt]exp•(7)显示函数调用栈信息•显示函数调用栈信息的命令•格式功能backtrace[n|-n]bt[n|-n]where[n|-n]打印当前的函数调用栈的所有信息。如果有参数n(正整数),则只打印栈顶上n层帧的信息;如果是-n的形式,则只打印栈底n层帧的信息frame[n]f[n]其中,n是栈中帧的编号,从0(表示栈顶)开始递增。如果不带参数,则显示出当前栈帧的信息;如果给出参数n,则选定帧号为n的帧作为当前帧up[n]表示向上移动n层栈帧。如果没有参数,则表示向上移动一层down[n]表示向下移动n层栈帧。如果没有参数,则表示向下移动一层infoframeinfof显示出当前栈帧的所有信息,如函数地址,调用函数的地址,被调用函数的地址,目前函数的程序语言、函数参数地址及值、局部变量的地址等。6.2.3改变和显示目录或路径•(1)directory命令一般格式是:directory[dir]或者dir[dir]•(2)cd命令使用格式为:cddir•(3)path命令使用格式是:pathdirs•(4)pwd命令•(5)showdirectories•(6)showpaths6.2.4控制程序的执行•断点(breakpoint),观察点(watchpoint),捕捉点(catchpoint)统称为停止点1.设置和显示断点(1)设置断点:用break命令(其缩写形式为b)设置断点:(2)显示断点•infobreakpoints[num]•infobreak[num]2.设置和显示观察点(1)设置观察点watchexpr(2)显示观察点•infobreakpointsinfowatchpoints3.设置捕捉点•命令catch的格式是:catchevent4.维护停止点•deletecleardisableenable5.运行程序•run命令的格式:run[args]6.程序的单步跟踪和连续执行(1)单步跟踪•实行单步跟踪的命令是step和next,其格式是:step[N]next[N](2)连续执行continue,c或fg命令7.函数调用callexprreturn[expr]6.2.5其他常用命令1.执行shell命令•其格式是:shellcommand-string2.修改变量值•(gdb)printx=10•(gdb)setvariablex=103.跳转执行•jumplinenum•jump*addr6.2.6应用示例示例程序源代码(1)使用带-g选项的gcc命令对该程序进行编译:•$gcc-gdbme.c-odbme•程序运行时出现错误——段错误(2)用程序名dbme作为参数启动gdb。(3)在gdb环境下运行该程序。•使用backtrace命令•使用list命令显示相关行的内容•利用print命令可以打印出任何合法表达式的值•(4)设置断点另外设置一个断点,i值等于99。6.3程序维护工具make6.3.1make的工作机制•GNU的make的工作过程如下:①依次读入各makefile文件;②初始化文件中的变量;③推导隐式规则,并分析所有规则;④为所有的目标文件创建依赖关系链;⑤根据依赖关系和时间数据,确定哪些目标文件要重新生成;⑥执行相应的生成命令。1.makefile文件•make被调用后会依次查找名为GNUmakefile,makefile和Makefile的描述文件•Makefile规则有以下通用形式:目标文件:[相依文件…]tab命令1[#注释]…tab命令n[#注释]•依赖行从一行的开头开始书写•各命令行单独占一行,每个命令行的第一个字符必须是制表符tab,而不能使用8个空格•#号后的内容为注释•在依赖行上,目标文件和相依文件之间要用一个或两个冒号分开•一个示例:prog:x.oy.oz.oassmb.ogccx.oy.oz.oassmb.o-L/home/mqc/lib-lm-oprogx.o:x.cdefs.hgcc-cx.cy.o:y.cdefs.hgcc-cy.cz.o:z.cgcc-cz.cassmb.o:assmb.sas-oassmb.oassmb.sclean:rmprog*.o6.3.2使用变量1.变量定义和引用•make的变量(又称做宏定义)一般均由大写字母和数字组成。•定义变量的一般格式是:变量名=字符串•引用make变量的方式与引用shell变量类似,即:把变量用圆括号括起来,并在前面加上“$”符号。例如:$(OBJECT)$(LIBES)2.自动变量•除了用户定义的变量外,make也可以使用环境变量、自动变量和预定义变量。•make中定义了一些它们的值会因环境的不同而发生改变的变量,被称为自动变量。例如:•$@表示规则中的目标文件集合•$?所有比目标文件还新的那些相依文件的集合,以空格分开•$规则中的第一个相依文件名•$^规则中所有相依文件的集合,以空格分开•$*如果目标文件的后缀是make所识别的,则$*就是去掉后缀的目标文件名3.预定义变量•归档库:ARARFLAGS•汇编命令:ASASFLAGS•C编译命令:CCCPPCFLAGSCPPFLAGS•C++编译命令:CXXCXXFLAGS6.3.4make命令常用选项•make命令有丰富的命令行选项。例如:-Cdir把目录改到dir-d输出所有的调试信息-e指明环境变量优先于makefile文件中的变量-ffile使用file文件作为makefile文件-I忽略在执行重新生成文件的命令的过程中出现的所有错误-Idir或–Idir指定一个包含makefile文件的搜索目录
本文标题:linux教程第04课_开发工具
链接地址:https://www.777doc.com/doc-2880996 .html