已阅读5页,还剩89页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第二章软件开发工具 操作系统 陆松年snlu 2 12 1文本编辑器vi vi 文件 通常一次只编辑一个文件 如果指定的文件不存在 vi就为你创建一个 如果不指定文件名 则必须在退出vi时指定存入的文件 在编辑一个已存在的文件时 vi将磁盘中文件的内容拷贝至内存编辑缓冲区 所有的输入 修改等操作都仅对编辑缓冲区内的数据起作用 只有当要求vi写入文件时 才用编辑缓冲区的内容替换原文件的内容 12 1 1vi概要 3 Vi的基本工作方法 vi有两种基本工作方法 一种是输入方法 另一种是命令方式 在输入方式 用户键入的任何内容都插到编辑缓冲区 直到按下ESC键才退出输入方式 回到命令方式 在命令方式 用户键入的内容作为命令解释 以执行vi提供的几十条编辑功能 一种特殊的命令方式是底行命令方式 即在输入命令 时 该字符连同光标移到了屏幕的底行 在该行上可执行一切行编辑命令 4 12 1 2屏幕编辑命令 一 移动光标命令1 以字符为单位移动 包括垂直方向 在命令状态下光标控制键 使用一些单字母的命令来移动光标 h光标左移一个字符单位j光标下移一个字符单位k光标上移一个字符单位l光标右移一个字符单位 5 w光标移到下一字的首字符处3 行首尾移动0光标移到当前行行首 第一列 光标移到当前行中第一个非空白字符处 光标移到当前行行尾4 以行为单位移动nRETURN光标下移n行G光标移到文件尾 2 以字 句子 段落为单位移动 6 5 以屏幕为单位移动 要使光标快速地在垂直方向移动以浏览或处理文件可以使用以下命令 H Hight 光标移到屏幕顶部M Middle 光标移到屏幕中部L Low 光标移到屏幕底部以下命令使得编辑缓冲区数据在屏幕上 滚动 而光标在屏幕上的相对位置并不改变 F Fowlow 下移一屏 B Back 上移一屏 7 二 输入方式 i 或a 在光标之前 或之后 插入o 或O 在当前行下 或上 面插入在输入过程中 你如果打错了一个或多个字符 可以用BACKSPACE 或DELETE 键删除它们 注意 在一些终端上 插入过程中不要使用 键 在命令行输入命令时也一样 在删除了这些字符后 你可以接着输入正确的数据 新输入的字符 将覆盖被删字符 8 三 删除命令 在用户输入数据并用ESC键退出了插入状态回到了命令状态后 就可以用删除 修改等命令修改正文 删除命令主要有以下几个 x删除光标位置的一个字符dw删除光标位置的一个字d 或D 删除自光标到本行未间的正文dd删除当前行dG从当前行一直删到最后一行d1G从当前行一直删到第一行大部分的删除命令都可带有重复数 如10 x删除自光标位置起的10个字符d5w删除自光标位位置起的5个字 9 四 修改命令 1 一对一的字符替换 replace r字符替换光标所在字符 如ra用字符a替换光标所在字符3rabc用abc三个字符替换自光标起的三个字符R输入串用输入串一对一地替换自光标位置起的任意多个字符 直至按ESC键2 替换指定数目的字符和行 substitude s替换指定数目的字符 如3sxyz用xyz替换光标开始处的三个字符 按ESC键退出替换 但输入部可以多于3个字符 也可少于3个字符 10 五 缓冲区与删除 抽取 放置命令 1 通用缓冲区vi编辑程序有一个通用缓冲区和26个有名缓冲区 所有的删除命令还把被删正文置入通用缓冲区 用户可以用p put 命令将通用缓冲区的内容取出放置到指定位置 故用删除命令和放置命令的组合可以实现把编辑缓冲区中的数据从一个位置搬移到另一个位置 例如 d5w命令删去光标所处位置起的五个字 并把删去的5个字置入通用缓冲区 将光标移动到新的位置后用p命令可使这5个字插到新的位置上 又如 先执行3dd命令 将光标移到指定行后再执行p命令就把原光标所在位置起的三行正文搬到了新的位置 11 如果用户不想删去正文就可以使用y yank 命令 用y命令和p命令的组合可以实现数据的拷贝 如使用命令2yy抽取当前行及下一行 将光标移到新的位置后用p命令把这二行拷贝至新的当前行之后 类似地y3w抽取3个字 而4y3w则抽取12个字 12 六 其他命令 u废除上一条命令所做的修改 重复执行上一个命令 13 12 1 3底行命令 在vi命令状态下 键入 或 光标就跳到屏幕的最底行 在该行可以输入对文件操作的命令 14 一 搜索命令 当用户键入了 后 vi在最底行 命令行 显示字符 和光标 接下来就可以键入查找模式了 可以用正则表达式指定模式 用 命令查找模式时 从当前的光标位置向下查找匹配模式的第一个字符串 光标停留在该字符串的第一个字符上 命令是 命令的反向搜索方式 使用n next 命令 用户不必输入模式就可以按原方向继续上一次的查找 使用N命令则按反方向继续查找 例 m ae y查找一个字的首部含有m ae y模式的串 该模式将匹配many may merry等单词 15 二 字符串替代 地址 s 模式 替代串 gcp 例 s alotof 在替代之前请求确认 可以再加上 c s UNIX Unix cg要删除指定模式的串 可将替代串部分置为空 s S ae ing gp字符串替代命令中如不指定地址部分 则仅对当前行执行替换 否则替代命令在指定的地址范围内执行 16 地址部分格式举例如下 地址搜索范围15第15行5 15从第5行至第15行1 从第1行至当前行 从当前行至最后一行 25从当前行至当前行后25行1 文件中的全部行例 1 s ten 10 g在整个文件中用字符串10替代字符串ten 即 ten 10 often of10 tenant 10ant 1 s 10 g仅对单词ten替换成10 17 三 行编辑命令 删除命令 地址 d删除地址部分指定的文件行 如不指定地址 则只删除当前行 如 10d删去当前行至当前行上面10行 共11行 行移动 地址 m 单地址 将地址部分指定的文件行移到起始地址为单地址的地方 例 10m20将第10行移到第20行之下 18 四 读写文件 读文件命令的模式为 单地址 r文件将文件中内容插到指定的地址位置后 地址缺省为当前行 例 rmyfile将文件myfile中全部内容插到编辑文件尾 写文件的格式为 地址 w 文件 如不指定地址 则将整个编辑缓冲区写入文件 如不指定文件 则将缓冲区数据写入调用vi指定的原文件 如指定的文件已在 而你确实想覆盖它 可用w file命令 19 隔一段时间打一下w命令较为安全 还可使用添加写的命令 如 w file将编辑文件添加到磁盘文件file的后面 10 20w example将第10行至第20行添加到文件example之后如果用户曾在vi中修改过正文 则先要执行 w命令将编辑文件盘后才能用 q命令退出vi 或直接执行保存文件后退出vi的命令 wq不存盘而强制退出的命令为 q 20 六 设置参数命令 setnu mber 在每一文件行前面显示行号 setnonu mber 取消行号 所有的设置命令都可以在参数前加上 no 取消 屏幕上显示的行号在编辑缓冲区中是不存在的 故在存盘时不会把行号存入文件中 21 12 1 4在vi程序中执行shell命令 shell命令在shell命令执行完成后 按RETURN返回vi 利用在vi中执行shell命令的功能可使用户在编写 调试源程序不必经常要进出vi 源程序输入完成后先用 w命令存盘 然后在vi中执行编译程序 如 cc 命令中 代表当前文件名 如果你的系统不支持 也可用 cc源文件 或 cc源文件 o目标文件 命令 记下编译时的出错信息 按RETURN返回到vi中去修改 22 最基本的vi命令 vifilename ci 或a 在光标之前 或之后 插入o 或O 在当前行下 或上 面插入BACKSPACE 或DELETE 键删除ESC键退出插入状态h光标左移一个字符单位j光标下移一个字符单位k光标上移一个字符单位l光标右移一个字符单位0光标移到当前行行首 第一列 光标移到当前行行尾保存文件后退出vi F Fowlow 下移一屏 B Back 上移一屏 23 x删除光标位置的一个字符dd删除当前行ra用字符a替换光标所在字符nsstr用str替换光标开始处的n个字符nyy将n行数据拷贝至缓冲区p把缓冲区行拷贝至新的当前行之后u废除上一条命令所做的修改 setnu mber 在文件行前面显示行号 setnonu mber 取消行号 24 str搜索指定模式的字符串str 地址 s 模式 替代串 g 对字符串进行替换 w file 则将整个编辑缓冲区写入文件 shell命令在vi程序中执行shell命令 wq保存文件后退出vi q 不保存文件退出vi 25 12 2C编译系统 cc是UNIX系统中的c语言编译程序 它能完成宏扩展 文件包括 编译 优化 汇编连接和装入等多种功能 cc编译命令的一般形式是 cc 选项 源程序和目标代码文件表 l库 12 2 1C编译基本过程 26 2 编译选项 影响cc编译阶段的选项是 g调试选项 这个选项使得编译程序在最终的可执行目标文件中包含附加的关于变量和源程序语句的信息 这些信息对于运行符号调试程序sdb是必须的 O优化选项 该选项调用外加的编译步骤 优化程序 以生成更有效的代码 27 12 2 5连接装入程序 扫描命令行中的目标文件和库文件参数libc a 标准c函数库 当cc生成二进制可执行文件时自动搜索该库 libm a 数学函数库 libplot a绘图子程序库 28 连接 装入选项 oname该选项使得最后生成的二进制可执行代码存入名为name的文件中 如不用 o选项 则存入名为a out的文件中 lx这个选项是档案库名 lib libx a的缩写 如果该档案库不存在 ld程序再看 usr lib libx a 库名参数x不限于单个字符 它可以是一个字符串 Ldir当用 lx指定档案库时 先在 L选项中指出的dir目录中查找档案库 再到 lib和 usr lib中查找 29 12 2 6一个使用cc的综合例子 cc Ddebug Oexample cmore cio sunit o oexample lmcc首先调用预处理程序 将源程序中说明的头文件包含进来 并将标识符debug的值置为1 处理有关条件编译的事务 然后调用编译程序 生成example c more c的汇编语言目标程序example s和more s 并对它们进行优化 再调用汇编程序生成目标代码example o more o和io o 最后调用连接 装入程序将cc生成的目标代码 参数表中列出的目标代码和数学库中的一些档案文件连接起来 对它们进行重定位 并生成可执行的二进制文件example 30 12 3库的维护 12 3 1库的概念 一个库文件是由一组文件通过运行ar库维护程序构成的 多数库文件是目标文件的集合 如C的标准库文件 lib libc a中就含有C的标准子程序及系统调用的全部目标文件 这些目标文件是由编译相应的 c文件集合而得到的 按约定 库文件名字以lib开头 以 a为后缀 31 库文件与目标文件的差异 尽管库文件与目标文件很相似 但是它们之间还是有关键的差异 当用户把几个目标文件连接成一个大程序时 这些目标文件中所有的内容都成为最终的可执行程序的一部分 根本不管你是否使用了其中的代码 当编译程序连接库的时候 用户在源程序要用到什么函数 编译程序就将库中对应的函数连接到用户的程序中 连接 装入程序把从库中取出的目标代码文件的符号表和二进制制可执行文件的符号表合并起来 32 12 3 2库的维护 1 创建新档案库或把文件加到现存档案库中这是一个最重要的库管理程序 arr v 库名目标文件表如将目标文件filea o fileb o filec o加入库文件libfile a中可用命令arrvlibfile afilea ofileb ofilec o也可利用模式生成文件名 arrvlibfile afile a c oar新建立包含这三个目标文件的库 33 与很多的UNIX系统程序不一样 ar的选项 rv 的前面没有 但这不会造成二义性 因为ar程序至少要求一个选项 选项r表示将指定的文件加入库中 必要时创建库文件 如果库中已有要加入的文件 则这个文件被新文件所代替 选项v表示详细 verbose 方式 使ar将每一完成的操作都显示出来 ar会自动地产生与目标文件外部符号名有关的符号表 34 2 列出库中的文件 这也是一个常用的命令 其格式为 art v 库 文件表 如指定文件表参数 则只列出这些文件 当选项v与t一起使用时 列出文件的详细描述 这类似于ls l命令的l选项 如命令 artvlibfile a以详细方式按序列出库文件libfile a中的所有文件 35 3 从库中提取文件 extract arxlibfile afileb o从库中提取fileb o 存放在当前目录下 该操作不改变库的内容 如果不提供目标文件名 则提取库中所有的文件 一般说 提取源代码或正文的档案要比提取目标代码的档案用的更普遍 如选项v与x一起使用 则详细方式 36 12 3 3动态库 前面介绍的库称为静态库 在编辑 连接程序时 编译程序将用户程序要调用的库函数全部连接到用户的程序中 组合成一个完整的不可分割的执行代码 在运行时 用户程序就与原库脱离了联系 如果有若干的应用程序要调用相同的库函数 那么各个应用分别都要把库中有关的函数连入自己的程序库中 这些冗余的代码极大地增加了程序的长度 平时要消耗较多的磁盘存储空间 这些应用同时运用时也要占用较大的内存空间 37 动态库的原理 动态库的原理类似于共享代码段 当用户在编译行中指定库时 编译程序并不将动态库中的函数连入用户的程序中 而只建立了对动态库的引用连接 因此所生成的目标代码长度要比使用静态库时小得多 在实际装入运行时 系统根据用户程序中的引用连接信息 再把动态库从盘中调入内存 当有若干程序要使用同一个动态库时 系统只要在内存中驻留该动态库的一个副本 各个调用程序共享同一个库的代码 这样大大减小了系统中执行代码的总长度 也使更多的用户程序可以并发地运行 38 从另一方面讲 如果系统中只有一个程序要使用库 那么采用动态库的方式比起采用静态库的方式非但不能减少执行代码的总长度 反而可能增加其长度 因为在连接静态库时 系统只把用户要调用的库函数连入程序中 而在连接动态库时 尽管所生成的目标代码中不包含库中的函数代码 但在执行时系统却要把整个动态库度都调入内存 在虚拟存储管理系统中只要部分调入即可 而不管是否要用到库中的全部函数 39 由静态库生成对应的动态库 方法是先从静态库中抽出所有的目标代码 以 o为后缀 再由这些目标代码组合而生成动态库 在一个不含其他目标代码的临时目录中 可通过执行以下命令产生动态库libisode so arxlibisode ald G o olibisode so 40 12 4维护程序的程序Make 多数的程序设计项目包含了大量的程序或模块 当系统要修改或增强功能时 这些源程序要经历各种变化 对一个源程序的改动就会使本模块或其他模块不能照原样工作 在大型软件开发项目中 要跟踪所有文件的变化是非常困难的 如果没有Make 在修改了一些文件后为了安装新的程序版本 所有的源程序都要重新编译和连接 否则将有很大的风险 因为要判断哪些程序才真正需要重新编译和连接是一个繁琐而乏味的过程 41 Make的功能 Make根据一些说明和文件的修改时间自动地维护模块间的关系 说明规定了模块之间的依赖关系以及为更新目标文件必须执行的动作或命令 Make的说明是存放在makefile或Makefile中的 Makefile定义程序是由哪些文件构成的 并用依赖性表示文件之间的相互联系 Make的主要责任是重新编译任何最近一次编译以后又已修改过的源文件以及任何依赖于其他已改变模块的源文件 只有依赖的文件修改或更新以后 而被依赖的目标文件还没有被更新 换句话说 目标文件已经 过时 了 就用跟随着依赖行后的构造命令更新目标文件 42 12 4 1Make使用初步 如有一个网络程序network 它是由编译二个源程序subnet c和service c而生成的 二个源程序都包含一个公共的头文件netdefs h 它们之间的关系见图11 2 43 头文件netdefs h预处理源程序文件subnet cservice c编译目标代码文件subnet oservice o连接可执行代码文件network图11 2一个示例软件系统的关系图 44 Make的依赖关系 在Makefile中 以非TAB符开始有冒号的一行描述文件的依赖关系 称为依赖行 冒号左边的文件是目标文件 冒号右边的文件是目标文件所依赖的文件或预需的文件 依赖行下面以至少一个TAB符开始的若干行描述了一组动作 即当依赖行冒号右边的文件得到更新从而使得左边的目标文件已 过时 后 就执行依赖行下面各个动作行所描述的一系列UNIX命令 在目标文件右面的依赖也可以为空 在依赖文件为空的情况下 该依赖行下面的命令就无条件地执行 45 network的依赖关系与动作 对于本例 因为程序network依赖于两个目标代码文件subnet o和service o 故只要这两个目标代码文件中的任一个在生成了执行程序network之后又得到了更新 程序network就过时了 应当重新连接subnet o和service o 以生成network的新版本 这样的依赖关系与动作在Makefile中可表示为 network subnet oservice occ onetworksubnet oservice o 46 类似地 subnet o依赖于subnet c 又由于subnet c中含有一个包含netdefs h文件的编译控制行 所以编译时的正文实际来自于两个文件 subnet c和netdefs h 只要在生成subnet o之后对这两个文件中任何一个又进行了更新 就要重新编译subnet c以生成更新版本的subnet o 这样的依赖关系与动作在Makefile中表示为 subnet o etdefs hcc csubnet c 47 综合起来 对于图11 2所示的软件系统 维护network程序的说明文件Makefile全部的依赖行和动作为 network subnet oservice occ onetworksubnet oservie osubnet o etdefs hcc csubnet cservice o etdefs hcc cservice c 48 依赖说明可以嵌套 依赖行上的依赖文件可以是其他依赖行上的目标文件 这样就构成了系统内部各文件层次状的依赖关系 如用户新改动了netdefs h 以后执行命令makenetwork Make从 network 这一依赖行开始自顶向下遍历以network为根的依赖关系树 由底向上考察每一个依赖行 并根据文件更新时间执行相应动作 由于每一个模块都依赖于头文件netdefs h 因此Make将依次执行每一组动作 cc cservice ccc csubnet ccc onetworksubnet oservice o 49 如果用户仅仅修改了源程序service c Make只发现service o和network这两个文件已过时 就执行了以下两个动作 cc cservice ccc onetworksubnet oservice o实际上为了生成一个network的更新版本 Make将执行最少量的必须做的再编译工作 Make是最讲效率的 在一个依赖行下可跟随任意多行的UNIX命令 直至下一个依赖行或空行为止 50 12 4 2Make的内部规则 上例给出的Make的说明比较繁琐 一般来说 service o通常都依赖于service c 对于其他的模块也是如此 为了简化说明 Make提供了一组内部依赖规则 只要在Make的说明文件中没有对这些规则的另外说明 Make就使用这些规则来产生目标文件 表11 1列出了Make内部规则 51 目标依赖规则 命令x ox ccc cx cx ox sas ox sx ox yyaccx ycc cy tab crmy tab cmvy tab ox ox cx yyaccx ymvy tab cx cx ax ccc cx carrvx ax orm fx o 52 如果一个目标文件已过时 make在当前目录下搜索与目标文件有相同的基本名但后缀不同的源文件 例如c源文件x c 并执行Make内部的规则或命令 用户也可以定义自己的缺省后缀推理规则 c o cc g c c仅有一个后缀的规则 例如 c 是描述怎样由x c建立x的规则 这对于从c源程序建立目标文件是很方便的 利用图11 3的Make内部规则 重写Makefile network subnet cservice ccc onetworksubnet oservice osubnet oservice o netdefs h 53 由上可以看到 由于利用了Make内部规则 原有关subnet o和service o的两个依赖行 现合并成一个依赖行 其动作部分取Make内部隐含规则 命令 使用Make内部规则也带来了一个新的问题 由x c x s x y和x l都可以产生x o目标文件 如果现在要更新x o 那么使用哪一条内部规则来产生x o呢 通过使用后缀的依赖关系表可以解决这个问题 后缀依赖关系缺省表为 SUFFIXES o c y l s sh表中的后缀次序决定了当Make发现了多重路径时 就按后缀表中的优先次序产生目标文件 例如在更新x o时 如系统中同时存在x c x y x l x s和x sh文件 由于在表中 c后缀是在 o后缀之后最先出现 故采用编译x c的命令更新x o目标文件 54 12 4 3Make中的宏 类似于定义shell变量 在Makefile中可以定义和使用宏 或称变量 宏定义的格式为 标识符 串表在定义了一个宏后 可以用 标识符 来引用宏 例如 CC usr ucb cc CC g c c用宏指令可以减少很多重复的部分 如要修改也只要修改宏定义这一行 如果不使用宏 用户就不得不对替代部分的每一次出现都进行修改 且有潜在的危险性 很可能造成不一致性 55 Make也使用shell变量或环境变量 所有的环境变量都被Make看成宏定义 例如 在Makefile中能以 HOME 取得用户的主目录 对环境变量的处理是在处理内部规则之后 但在处理Makefile之前 故在发生冲突的情况下 Makefile中的宏定义覆盖环境变量 与C语言的include编译指示行类似 可以在Makefile含有包含文件指示行 如includemacros mkmake程序就读入include后面的文件名 而后处理该文件中的各种宏定义符 56 2 内部宏 Make使用五种不同形式内部宏 或称内部变量 它们是 和 这些宏对建立目标文件要写的规则非常有用 下面是一个由 c文件产生 o文件的缺省规则 c o cc g c 宏 扩展成使目标已过时的依赖文件名 在上面例子中被扩展成 c文件 宏 扩展成不带后缀的依赖文件名 上面的推理规则可重写成 c o cc g c c 57 宏 扩展成目标文件的名字 只能用于跟随在显式说明行下面的命令中 如在依赖关系行使用 要写成 在下例的说明中 代表目标文件network network subnet cservice ccc o subnet oservice o宏 与宏 类似 但它用于显式产生目标文件规则的情况下 扩展成使目标文件已过时的依赖文件名 宏 用于目标是库文件时的情况 如果目标或依赖文件包括括号 那么该目标或依赖文件是档案库 括号中的串名就是库中的一个成员文件 假定依赖行是具有libx a libx a file o 的形式 那么 扩展成库libx a的成员file o 而 赋值为libx a 58 3 预置宏 make有一组预置宏 这些宏主要用于Make的推理规则和命令中 一些重要的预置宏列举表11 2中 在表中的预置值一栏里 减号 表示该宏被置为空 这些宏也能像其用户定义的任何其他宏一样在Makefile中重置 如CFLAGS g c 59 12 4 4用Make维护库 与档案库有关的推理规则形如 x a 下面是一个关于库lib的规则 libx a libx a file1 o libx a file2 o libx a file3 o echolibisnowup to date c a CC c CFLAGS AR ARFLAGS orm f o实际上 上面列出的 c a规则已作为Make的内部规则 因此在本例中是不必写出的 60 下面的例子使用了宏扩展的替换方式 表示一组目标库lib中的目标文件名 以 o为后缀 这些目标文件又相对于各自的 c文件来说已是过时了 宏替代 o c 将过时的 o文件替换成 c文件 libx a libx a file1 o libx a file2 o cc c CFLAGS o c AR ARFLAGS rm f echolibisnowup to date c a 由于上例已显式写出了lib的依赖与规则 故最后用 c a 形式禁止了 c a的缺省后缀推理规则 61 12 4 5一个综合例子 exampleofMakefileCFLAGS O gLDFLAGS CC ccHEADER netdefs hcom hSOURCE subnet cservice cLIBSRC ssap ctsap cOBJECT SOURCE c o LIBOBJ ssap otsap oLIBDIR usr local lib 62 c o CC CFLAGS c call networkinstallnetwork OBJECT LIBDIR libnet a CC o OBJECT L LIBDIR lnetsubnet oservice ossap otsap o HEADER defultaction CC CFLAGS c clibnet a LIBOBJ arrv LIBOBJ 63 install networklibnet a mv INSTDIR networknetwork old mvnetwork INSTDIR mv LIBDIR libnet alibnet a old mvlibnet a LIBDIR clean rmcore o networklibnet adate tmp cleanlog print SOUCE HEADER echoprintingmodifiedsourceand headfilespr lp touch readable echo test rnetdefs h sh 64 几点说明 在上面的Makefile中 目标all不是文件名 在该行以下也没有动作行 如以命令makeall启动make程序 make将依次考察network和install这两个目标 宏定义CFLAGS O g不仅使得在编译命令行的宏代换时 而且也在make用隐含的构造命令调用c编译程序时总是选用优化选项 O和调试选项 g 在install依赖行以下的命令是在生成了执行程序network和库libnet a后 将它们搬移到系统的公用目录中 以便于用户共享 65 clean依赖行没有依赖文件 因此以clean为目标启动make时 总是要执行该依赖行下面的命令 其目的是在编译和安装完成后 清除一些不必保存的文件以节省磁盘空间 在print依赖行中 第一次执行时 也没有一个真正的print目标文件 它只是一个假想已过时的文件 只要指定print为目标 make总是执行下面的打印命令 在打印了文件后 用UNIX的touch命令产生了名为print的辅助文件 并记住了print的修改时间 以后重新修改一些源程序或头文件后 根据依赖行和打印参数 只打印在上一次打印后重新修改过的文件 接着再重置print的更新时间 下面对Makefile作其他方面的说明 66 1 消除显示命令 一般情况下make将显示它执行的每一个命令 但有三种方法可以消除显示make执行的命令 1 make执行任何以 字符开头的命令时 不显示该命令 2 在makefile中加入伪依赖行 SILENT 该依赖行使得make在执行命令时关闭命令显示机构 伪依赖行在Makefile中的位置无关紧要 另外 一旦命令显示被关闭以后就不能再打开了 3 以 s选项启动make 这与在makefile中的伪依赖行 SILENT 的作用一样 67 2 忽略返回代码 在UNIX系统中每一个命令都返回一个数值代码 该值为零说明程序执行成功 正常返回 相反 非零返回码说明程序执行失败 或出错 make使用命令的返回码来决定它是否要继续执行在命令行或内部规则中给出的命令 如命令返回非零码 make就停止处理Makefile 并显示出错信息 有时用户也需要make在发现一个错误时能继续处理余下部分 1 在Makefile的命令前面加上前导连字符 2 在Makefile中任何位置上加入伪依赖行 IGNORE 忽略了所有程序的返回码 3 以 i选项启动make 68 3 注释和续行 在Makefile中以 开头的是注释行 make将不处理这些行 如果一个依赖行或命令行太长可以用出现在行尾的反斜线 来续行 make对于每一行命令及以反斜线连续的下一行命令启动同一个shell进程处理 4 shell内部命令 make启动的shell只能按环境查找和执行UNIX的外部命令 因为test是shell内部命令 所以该命令必须以标准输入的形式传给shell进程 69 12 4 6make命令选项和参数 make程序能读取命令行上的很多选项 f用跟在f后面的指定的文件作为Make的描述文件 该选项如缺省 make首先在当前目录中找makefile 其次找Makefile 如 f后的参数为 make所将从标准输入上读取描述文件Makefile i迫使make忽略命令的非零返回值 该选项的作用同Makefile中的伪依赖行 IGNORE n展开所有的元字符 进行宏代换 印出命令 向用户显示make将做什么 但不真正执行命令 70 s沉默方式 在执行命令前不印出命令行 该选项的作用同Makefile中的伪依赖行 SILENT t触摸 touch Makefile中所有过时的目标 即更新任何跟随依赖行的命令 用该选项启动make主要用于仅仅对一些依赖文件作一些加入注释之类的修改 这样可以省做很多不必要的重新编译工作 来产生同样的目标代码 虽然用 t选项能代替对单个目标文件执行touch命令 但一般情况下这可能会破坏Make的一致性 71 除了选项以外 make命令行还能带有其他参数 如在命令行上置宏 一旦在命令行置宏 任何进一步的赋值都不能改变这些宏 在make命令行也能指定要更新的目标 这对打算生成部分的系统而不是完整的系统时是非常有用的 如不指定目标 make就更新Makefile中的第一个依赖行上的目标 下面是包括选项 指定目标和置宏的make命令行 make fmymakefilenetwork CFLAGS g 只要掌握了Make的原理 也能将它用于维护其他的软件系统 如维护用户手册 很多其他的软件任务也就借助于Make来实现 Make的威力是无限的 72 12 5调试程序 调试排错程序在程序设计环境中得到了广泛的应用 调试程序包括在程序员的控制下运行程序和检查在程序非正常终止后由系统转储的内存映像 程序非正常终止时一般显示类似Buserror coredumped或Memoryfault coredumped等信息 由于程序本身的错误而造成非正常终止后 用户可以静态地检查 分析各个源程序和模块之间的接口 也可在源程序中插入一些打印语句 动态地跟踪 观察程序执行的过程 但一种更为系统的方法是利用UNIX系统提供的调试排错软件Debuggers 通过检查源程序和出错时系统转储的内存映像文件 coreimagefile 来帮助排除错误 开发程序 当前使用的主要的调试排错软件程序有dbx adb和sdb 73 12 5 1调用sdb 第一个参数是可执行目标程序名 第二个参数是内存映像文件core 第三个参数是用冒号隔开的源文件所在的目录表 所有的参数都是可选的 在缺省时 sdb将把a out作为目标文件 core作为内存映像文件 当前目录作为第三个目录表参数 对要调试的程序example用 g选项编译cc g oexampleexample c当运行程序example时产生了 coredumped 信息接下来就可运行sdb来调试程序了 sdbexamplecore 74 12 5 2sdb的调试命令 模式定位到匹配模式的字符串所在的源程序行 该命令类似于vi的查找模式命令 行号b 命令 命令 在行号处设置断点 程序在断点处执行命令组后继续向下执行 如无命令 sdb在断点处等待用户输入命令 变量名 项数长度格式 显示变量的内容 地址 显示格式按格式显示指定地址单元的内容 s单步执行 75 12 6源代码控制系统 SCCS 一个需长时间开发 维护的软件包含很多文件 当程序的一个版本已经在使用时 常因发现错误和为增强功能需要对它进行修改 为安全起见 在实际修改之前对有关该程序的很多文件进行备份是必须的 如果用户只保存文件的最新版本 这就很容易丢失版本的变化情况 不能恢复到修改前的情况 当有需要回溯到一个程序的老版本 以图再开发时 这尤其重要 这种靠对程序的所有版本都进行备份的简单方就显得非常笨拙 不易使用和低效 而且很有可能造成版本的不一致和混乱的情况 76 SCCS SourceCodeControlSystem 用于控制和维护程序的各个历史版本 SCCS并不存储程序的多个拷贝 对于程序的不同版本 SCCS总是只存储一个物理文件 并在其中存储了程序经历的增量变化 即修改内容 SCCS有一个复杂而精致的机制来标识和编号不同的版本 SCCS能用于存储 查询文件的任一版本 提供控制文件修改权限机制 记录每次修改的原因 内容 时间等内容 SCCS适合于维护任何类型的正文文件版本 但最多的还是用于维护源程序的不同版本 77 12 6 1创建SCCS的初始版本 admin etslib s subnet cadmin etslib s service c现在已创建了在SCCS管理下的s 文件 s 文件必须以s 开头 SCCS总是将s 文件创建为只读模式 444 admin命令一次只能创建一个s 文件 用户可以编写一个shell过程自动地处理这批文件 在创建了所有的s 文件后 对应的原始文件应当删除 在上面这个例子中应当删除工作目录的subnet c和service c这两个文件 在netslib目录中的两个s 文件是这个软件版本的最终拷贝 78 12 6 2提取一个版本 用get命令提取的文件称为g 文件 g 文件名同原admin命令所处理的原始文件名 即s 文件去掉前缀s 的文件名 由路径1获得的g 文件使用户能够编译它 以产生相应的目标代码文件 使用该命令的一个例子为 getnetslib etslib s service c上面的get命令从netslib目录中提取二个只读文件放入工作目录中 提取出来的文件命名为去除前缀s 的s 文件名 79 get命令1s 文件2get e命令只读文件delta命令可编辑文件图11 5提取s 文件的版本 80 如果用户需要提取netslib目录中很多s 文件 对此SCCS为用户提供了方便的操作方法 即可以用一个目录作为get的参数 在这种情况下 SCCS就提取那个目录中的所有s 文件 例 getnetslib当从SCCS数据库中提取了有关文件后 用户就可以用寻常的方法对它们进行编译 或使用make来创建目标程序 81 路径1的set命令所提取的文件是s 文件的只读拷贝 用户不应修改这些文件的权限和内容 路径2带 e选项的get命令提取一个可编辑的文件版本并向用户显示原先版本号和将建立的版本号 用户可以用普通的编辑软件对它们进行修改 get enetslib s subnet c可以防止不同用户同时对一个s 文件操作的措施是当一个用户用get e命令提取SCCS数据库目录的一个s 文件后 SCCS在该目录中创建了一个p file 其他用户试图再执行get e操作时就会出错 直至前一用户完成了修改和测试 执行delta操作后才将p file删去 82 12 6 3建立一个新版本 在对用get e命令获得的g 文件完成了修改和测试后就可用delta命令创建新版本 例 deltanetslib subnet ccomment delta命令首先提示用户输入注释 用户可输入有关本次修改的目的和摘要 以便跟踪软件系统的变化 在delta程序完成了建立新版本的工作后就将g 文件删除 用户如果要编译该文件或用make创建目标程序 必须再做另外一次get操作 以获得该文件的一个只读拷贝 83 12 6 4显示SCCS文件的历史 prs命令用于显示对一个SCCS文件所做的所有变化 例prsnetslib s subnet cprs程序显示s 文件的由最新到最老的每一个版本号 创建版本的日期和时间 谁创建该版本 在创建该版本时用户所做的修改摘要 插入行数 删除行数 未变行数 最后显示用户在delta命令中输入的注释 84 12 6 5SCCS的版本号结构 用admin命令建立的SCCS文件初始版为1 1 以后由相继的get e和delta命令建立的SCCS文件各个版本依次为1 2 1 3 版本号更一般的形式为 release level branch sequence 发表号 级号 分支号 序列号 如果用户对SCCS文件做了较大的修改 可以改变新版本的release号 get e r2netslib s sub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 市政工程质量管控专项施工方案
- 石灰稳定土施工专项方案
- 安全带缺失处置方案
- 防水专项施工方案
- 狂犬病暴露处置方案
- 构造柱及圈梁施工方案
- 2026年临床研究协调员临床试验风险管理试题及答案
- 护理查房中的感染控制
- 胃炎的健康教育
- 痛风护理中的护理实践指南
- 国家事业单位招聘2025中国人民大学财务处招聘3人笔试历年参考题库典型考点附带答案详解
- T∕CAMDA 36-2026 双孢蘑菇采摘机器人
- 商贸物流专业群建设方案
- 吾悦广场内部管理制度
- 汉服文化融合的现代化办公空间设计
- 广东省广州市2025年中考历史真题试卷(含答案)
- CT成像基础课件
- 索尼摄像机DCR-SR47E中文说明书
- 安徽卷2025年高考物理真题含解析
- 中国电信集团有限公司2023ESG发展报告:通信行业的监管政策与合规监督
- GB/T 45763-2025精细陶瓷陶瓷薄板室温弯曲强度试验方法三点弯曲或四点弯曲法
评论
0/150
提交评论