Linux实用教程 第9章Linux编程基础

上传人:fgh****35 文档编号:253004793 上传时间:2024-11-27 格式:PPT 页数:71 大小:3.20MB
返回 下载 相关 举报
Linux实用教程 第9章Linux编程基础_第1页
第1页 / 共71页
Linux实用教程 第9章Linux编程基础_第2页
第2页 / 共71页
Linux实用教程 第9章Linux编程基础_第3页
第3页 / 共71页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,中英文日报导航站 ,*,第,9,章,Linux,程序设计基础,本章学习目标,通过对本章的学习,读者应该掌握以下主要内容:,Linux,编程风格,Linux,下,IDE,的使用,Linux,下使用,GNU cc,开发应用程序,Linux,程序的调试,Linux,下使用,RCS/CVS,来管理源程序,Linux,下软件打包,中英文日报导航站 ,9.1,概述,9.1.1,Linux,编程,Linux,软件开发一直在,Internet,环境下讲行。这个环境是全球性的,编程人员来自世界各地。只要能够访问,Web,站点,就可以启动一个以,Linux,为基础的软件项目。,Linux,开发工作经常是在,Linux,用户决定共同完成一个项目时开始的。当开发工作完成后,该软件就被放到,Internet,站点上,任何用户都可以访问和下载它。由于这个活跃的开发环境,新的以,Linux,为基础的软件功能日益强大,而且呈现爆炸式的增长态势。,大多数,Linux,软件是经过自由软件基金会(,Free Software Foundation,),提供的,GNU,(,GNU,即,GNUs not UNIX,),公开认证授权的,因而通常被称作,GNU,软件。,GNU,软件免费提供给用户使用,并被证明是非常可靠和高效的。许多流行的,Linux,实用程序如,C,编译器、,shell,和编辑器都是,GNU,软件应用程序。,中英文日报导航站 ,Linux,程序需要首先转化为低级机器语言即所谓的二进制代码以后,才能被操作系统执行。例如编程时,先用普通的编程语言生成一系列指令,这些指令可被翻译为适当的可执行应用程序的二进制代码。这个翻译过程可由解释器一步步来完成,或者也可以立即由编译器明确地完成。,shell,编程语言如,BASH,、,TCSH,、,GAWK,、,Perl,、,Tcl,和,Tk,都利用自己的解释器。用这些语言编制的程序尽管是应用程序文件,但可以直接运行。编译器则不同,它将生成一个独立的二进制代码文件然后才可以运行。,中英文日报导航站 ,9.1.2,Linux,编程风格,(,1,)函数返回类型说明和函数名分两行放置,函数起始字符和函数开头左花括号放到最左边。,(,2,)尽量不要让两个不同优先级的操作符出现在相同的对齐方式中,应该附加额外的括号使得代码缩进可以表示出嵌套。,(,3,)按照如下方式排版,do-while,语句:,(,4,)每个程序都应该以一段简短的说明其功能的注释开头。,(,5,)请为每个函数书写注释,说明函数是做什么的,需要哪些入口参数,参数可能值的含义和用途。如果用了非常见的、非标准的东西,或者可能导致函数不能工作的任何可能的值,应该进行特殊说明。如果存在重要的返回值,也需要说明。,(,6,)不要声明多个变量时跨行,每一行都以一个新的声明开头。,(,7,)当一个,if,中嵌套了另一个,if-else,时,应用花括号把,if-else,括起来。,(,8,)要在同一个声明中同时说明结构标识和变量或者结构标识和类型定义,(,typedef,),。,先定义变量,再使用。,1,GNU,风格,中英文日报导航站 ,(,9,)尽量避免在,if,的条件中进行赋值。,(,10,)请在名字中使用下划线以分割单词,尽量使用小写;把大写字母留给宏和枚举常量,以及根据统一惯例使用的前缀。例如,应该使用类似,ignore_space_change_flag,的名字;不要使用类似,iCantReadThis,的名字。,(,11,)用于表明一个命令行选项是否给出的变量应该在选项含义的说明之后,而不是选项字符之后被命名。,2,Linux,内核编程风格,(,1,),Linux,内核缩进风格是,8,个字符。,(,2,),Linux,内核风格采用,K&R,标准,将开始的大括号放在一行的最后,而将结束的大括号放在一行的第一位。,(,3,)命名尽量简洁。不应该使用诸如,ThisVariableIsATemporaryCounter,之类的名字。应该命名为,tmp,,,这样容易书写,也不难理解。但是命名全局变量,就应该用描述性命名方式,例如应该命名“,count_active_users()”,,,而不是“,cntusr,()”,。,本地变量应该避免过长。,中英文日报导航站 ,(,4,)函数最好短小精悍,一般来说不要让函数的参数多于个,否则应该尝试分解这个过于复杂的函数。,(,5,)通常情况,注释说明代码的功能,而不是其实现原理。避免把注释插到函数体内,而写到函数前面,说明其功能,如果这个函数的确很复杂,其中需要有部分注释,可以写些简短的注释来说明那些重要的部分,但是不能过多。,9.2,IDE,使用,9.2.1,VIM,编辑器,1,VIM,的简介,VI,是,Linux,世界里最常用的全屏编辑器,所有的,Linux,机器都提供该编辑器,而,Linux,里提供的是,VI,的加强版,VIM,,,但同,VI,是完全兼容。,VI,的原意是“,visual interface,”,,,即可视编辑器,用户键入的内容会立即被显示出来、而且其强大的编辑功能可以同任何一种最新的编辑器相媲美。它在,Linux,上的地位就仿佛,Edit,程序在,DOS,上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据需要对其进行定制,这是其他编辑程序所没有的。,VI,不是一个排版程序,不象,Word,或,WPS,那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。,中英文日报导航站 ,2,VIM,的基本观念,VIM,有三种操作方式,分别是:,命令方式,插入方式,命令行方式,3,VIM,的进入与离开,在系统提示符“,$”,下键入命令,VIM,,,后面跟上想要编辑(或者建立)的文件名,,VIM,可以自动载入所要编辑的文件或是开启一个新文件。,VIM,的退出,可以在命令行方式下使用命令“,:,wq,”,或者“,:,q,!”,,前者的功能是写文件并从,VIM,中退出,后者的功能是从,VIM,中退出,但不保存所作的修改(注意冒号)。,中英文日报导航站 ,4,VIM,的命令方式,(,1,)光标移动,要对正文内容进行修改,必须先把光标移动到要修改的内容所在的位置,用户除了通过按键盘的上、下、左、右箭头键来移动光标,还可以利用,VIM,提供的众多字符组合键,在正文中移动光标,迅速达到指定的行或列,实现定位,常用的快捷键有:表,9-1,(,2,)替换和删除,将光标定位于文档中指定位置后,可以用其他字符替换光标所指向的字符,或从当前光标位置删除一个或多个字符,常用命令有:表,9-2,(,3,)粘贴和复制,在,VIM,编辑器中,与,Windows,系统不同的是从正文中删除的内容(如字符、字段或行)并没有真正丢失,而是被剪贴并复制到了一个内存缓冲区中,用户可将其粘贴到正文中的任意位置,完成这一操作的命令是:表,9-3,中英文日报导航站 ,(,4,)查找字符串,为了方便文档的编辑,,VIM,提供了强大的字符串查找功能,要查找文件中指定字符或字段出现的位置,可以用该功能直接进行搜索,搜索方法是:在命令行键入字符,“,/,”,,后面加上要搜索的字符串,然后按回车键,编辑程序将执行正向搜索(从光标所在的位置向文件末尾方向),并在找到指定字符串后,将光标停在该字符串的开头;键入,n,命令可以继续执行搜索,找出这一字符串下次出现的位置,用字符,“,?,”,取代,“,/,”,,可以实现反向搜索(从光标所在的位置向文件开头方向),举例说明如下:表,9-5,(,5,)撤销和重复,在编辑文档的过程中,可以取消错误的编辑命令造成的后果,另外,如果用户希望在新的光标位置再次执行先前的编辑命令,可用重复命令。表,9-6,中英文日报导航站 ,5,VIM,的插入方式,(,1,)进入插入方式,在命令方式下正确定位光标之后,可用一下命令切换到插入方式:,表,9-7,如果用户想利用已有的文件内容,可以使用命令“:,i filename,”,,则,VIM,将指定文件的内容输入当前光标的下一行,且,VIM,仍处于命令方式。,(,2,)退出插入方式,退出插入方式的方法是,按,ESC,键或组合键,Ctrl+I,(,3,)正文替换,除了几种简单的切换到插入方式的方法外,还有一些命令允许用户在插入模式之前首先删去一段文字,从而实现正文的替换,这些命令包括:,表,9-8,6,VIM,的命令方式,(,1,)行号与文件,编辑中文档的每一行正文都有隐藏的行号,用下列命令可以移动光标到指定行:,表,9-9,中英文日报导航站 ,在命令方式下,用户可以规定命令操作的行号范围,数值用来指定绝对行号;字符“,,,”表示光标所在行的行号;字符“,$,”,表示正文最后一行的行号,示例如下:,表,9-10,在命令方式下,用户还可以对文件进行操作,允许从文件中读取正文,或将正文写入文件,常用命令如下:,表,9-11,9.2.1,VIM,编辑器,1,emacs,的简介,emacs,文本编辑器可以用来编辑文本、剪辑和粘贴文本内容、提供个人日历和日记,阅读,Usenet,新闻、发送电子邮件,同时还是一种程序语言解释器,可以编辑,C,、,Lisp,、,Tev,源代码文件、以及,Linux,的,Shell,。,emacs,是由,Richard Stallman,发明的,这位发明者还创建了自由软件基金会(,Free Software Foundation,,,简称,FSF,)。,最初的,emacs,是用来编辑宏命令的,现已进一步扩充为,UNIX,用户中装机用户数量最大、功能最齐全的免费文本编辑器了。,中英文日报导航站 ,emacs,同,VI,不一样,没有编辑状态和指令状态之分,其最重要的概念是其独特的缓冲区,,emacs,编辑的所有文件都是放在缓冲区中的,,emacs,支持同时编辑多个缓冲区,可以将一个文件在多个缓冲区中打开不同的拷贝,甚至其所有的在线帮助和文档以及出错信息都是作为一个缓冲区来显示的,当然这些缓冲区是不可写的,用户可以在这些缓冲区之间拷贝和粘贴文本。并且一般所有的缓冲区在硬盘上都有一个以“,#”,开头的备份文件,这样在系统突然崩溃的时候可以即时将用户的工作进行备份。,在编辑文件时,如果用户在编辑一些特殊类型的文件,例如当用户编辑扩展名为,.,c,的,C,语言文件时,,emacs,会产生菜单选项,c,,,向用户提供一些针对编辑,c,程序特别有用的一些命令。当用户编辑扩展名为,.,txt,的文件则会多出菜单选项,tex,,,让用户在编辑完,tex,文件后可以即时地观看输出并打印。首先介绍一下几个常见的键盘操作符号的意义:所有的,emacs,的操作键都是由,Control,键(一般是键盘上的,Ctrl,键)和,META,键(一般是键盘上的,Alt,键)加上一些键的组合组成的,如果没有,Alt,键,则可以用输入一个,Esc,,,再输入相应的键来代替。例如:, C-x,:,表示同时按住,Ctrl,键和,x,键。, C x,:,表示先按住,Ctrl,键,然后释放它,再按下,x,键。, M-x,:,表示同时按住,Alt,键和,x,键。, M x,:,表示先按住,Alt,键,释放它,再按下,x,键。,中英文日报导航站 ,2,emacs,的启动和退出,emacs,可以用两种方法启动。第一种启动,emacs,的方法是不装载任何文本文件启动,emacs,,,输入以下命令行:,#,emacs,在屏幕上会出现无任何文本,emacs,编辑窗口,如图,9-2,所示。,如果用户是初学者,最好的学习方法是:按下,Ctrl-h,键(即按住,Ctrl,键后不放,再按下,h,字母键),就会自动进入,emacs,的联机帮助,在屏幕底部,emacs,命令行中会出现一个提示符,这时再按下字母键,t,和回车键,便进入了简捷有效的,emacs,文本编辑器的教程。参照此教程的步骤,用户将对如何使用,emacs,有个概括的了解。,中英文日报导航站 ,第二种启动,emacs,的方法是通过装载某一个文本文件启动,emacs,,,输入以下命令行:,#,emacs,filename,如果装载的文件不在当前目录时必须输入该文件名的全称(包括所在目录)。例如,当前目录下有一个文本文件,myfile,.txt,,用,emacs,对其编辑时,输入命令行启动,emacs,:,#,emacs myfile,.txt,屏幕上将出现如图,9-3,所示的,emacs,编辑窗口。,中英文日报导航站 ,3,emacs,的基本操作,(,1,)光标的移动,下面列出,emacs,中的光标的移动情况及其键盘操作:, M-b,:,光标移动到光标左边的单词的开始处。, M-f,:,光标移动到光标右边的单词的开始处。, M-a,:,光标移动到当前句子的开始处。, M-e,:,光标移动到当前句子的结束处。, C-n,:,光标移动到下一行。, C-p,:,光标移动到上一行。, C-a,:,光标移动到行首。, C-e,:,光标移动到行尾。, M-,:,光标移动到文件尾。, M-,编译”命令进行程序的编译,如图,9-15,所示。如果程序没有出错,将看到,Kdevelop,下方的信息框之中显示编译成功的信息。,接着便可以执行应用程序了,执行“建立,-,执行”命令进行程序的连接,如图,9-16,所示。若没有发生问题,就会在另一个窗口中看到程序的执行结果,如图,9-17,所示。,图,9-15,编译应用程序,中英文日报导航站 ,图,9-16,执行应用程序,图,9-17,应用程序的执行结果,中英文日报导航站 ,9.3,使用,GNU cc,开发应用程序,9.3.1,使用,GNU cc,1,gcc,的简介,gcc,可以使程序员灵活地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理,如图,9-18,所示。,预处理,链接,编译,组译,源程序,(*.,c),可执行文件,预处理器,编译器,组译器,连接器,2,gcc,的版本信息,一般来说,系统安装后就已经安装和设定好了,gcc,。在,shell,的提示符下键入,gcc,v,,,屏幕上就会显示出目前正在使用的,gcc,的版本,同时这可以确定系统所支持的是,ELF,还是,a.out,可执行文件格式。,中英文日报导航站 ,Linux,系统中可执行文件有两种格式。第一种格式是,a.out,格式,这种格式用于早期的,Linux,系统以及,Unix,系统的原始格式。,a.out,来自于,Unix C,编译程序默认的可执行文件名。当使用共享库时,,a.out,格式就会发生问题。把,a.out,格式调整为共享库是一种非常复杂的操作,由于这个原因,一种新的文件格式被引入,Unix,系统,5,的第四版本和,Solaris,系统中。它被称为可执行和连接的格式(,ELF,)。,这种格式很容易实现共享库。,ELF,格式已经被,Linux,系统作为标准的格式采用。,gcc,编译程序产生的所有的二进制文件都是,ELF,格式的文件(即使可执行文件的默认名仍然是,a.out,)。,较旧的,a.out,格式的程序仍然可以运行在支持,ELF,格式的系统上。,3,gcc,的使用,gcc,的使用格式如下:,$,gcc,optionsfilenames,其中,filenames,为所要编译的程序源文件。,当使用,gcc,时,,gcc,会完成预处理、编译、汇编和连接。前三步分别生成目标文件,连接时,把生成的目标文件链接成可执行文件。,gcc,可以针对支持不同的源程序文件进行不同处理,文件格式以文件的后缀来识别,常见的如表,9-1,所示。,中英文日报导航站 ,4,使用优化选项,当用,gcc,编译,C,代码时,它会试着用最少的时间完成编译并且使编译后的代码易于调试,.,易于调试意味着编译后的代码与源代码有同样的执行次序,编译后的代码没有经过优化。有很多选项可用于告诉,gcc,,,在耗费更多编译时间和牺牲易调试性的基础上,产生更小更快的可执行文件。这些选项中最典型的是,-,O,和,-,O2,选项。,-,O,选项告诉,gcc,对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。,-,O2,选项告诉,gcc,产生尽可能小和尽可能快的代码。,-,O2,选项将使编译的速度比使用,-,O,时慢。但通常产生的代码执行速度会更快。,5,使用调试,和剖析,选项,GCC,支持数种调试和剖析选项。在这些选项里最常用的是,-,g,和,-,pg,选项。,-,g,选项告诉,gcc,产生能被,GNU,调试器使用的调试信息以便调试程序。,gcc,提供了一个很多其他,C,编译器里没有的特性,在,gcc,里能使,-,g,和,-,O(,产生优化代码,),连用。这一点非常有用,因为能在与最终产品尽可能相近的情况下调试代码。同时使用这两个选项时必须清楚所写的某些代码已经在优化时被,gcc,作了改动。,-,pg,选项告诉,gcc,在程序里加入额外的代码,执行时,产生,gprof,用的剖析信息以显示程序的耗时情况。,中英文日报导航站 ,9.3.2,使用,GNU make,编辑,makefile,1,准备工作,要使用,make,,,必须编写一个叫做,Makefile,的文件,这个文件描述了软件包中文件之间的关系,提供更新每个文件的命令。一般在一个软件包里,通常是可执行文件靠目标文件来更新,目标文件靠编译源文件来更新。,Makefile,写好之后,每次改变了某些源文件,只要执行,make,命令:,#,make,所有必要的重新编译将执行。,Make,程序利用,makefile,中的数据和每个文件的最后修改时间来确定那个文件需要更新,对于需要更新的文件,,make,程序执行,makefile,数据中定义的命令来更新。,2,makefile,文件的基本结构,GNU make,的主要功能是读进一个文本文件,makefile,并根据,makefile,的内容执行一系列的工作。,makefile,的默认文件名为,GNUmakefile,、,makefile,或,Makefile,,,当然也可以在,make,的命令行中指定别的文件名。如果不特别指定,,make,命令在执行时将按顺序查找默认的,makefile,文件。多数,Linux,程序员使用第三种文件名,Makefile,。,因为第一个字母是大写,通常被列在一个目录的文件列表的最前面。,中英文日报导航站 ,Makefile,是一个文本形式的数据库文件,其中包含一些规则来告诉,make,处理哪些文件以及如何处理这些文件。这些规则主要是描述哪些文件(称为,target,目标文件,不要和编译时产生的目标文件相混淆)是从哪些别的文件(称为,dependency,依赖文件)中产生的,以及用什么命令(,command,),来执行这个过程。,依靠这些信息,,make,会对磁盘上的文件进行检查,如果目标文件的生成或被改动时的时间(称为该文件时间戳)至少比它的一个依赖文件还旧的话,,make,就执行相应的命令,以更新目标文件。目标文件不一定是最后的可执行文件,可以是任何一个中间文件并可以作为其他目标文件的依赖文件。,一个,Makefile,文件主要含有一系列的规则,每条规则包含以下内容。,一个目标(,target,),即,make,最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“,clean”,。,一个或多个依赖文件(,dependency,),列表,通常是编译目标文件所需要的其他文件。,一系列命今,(,command),,是,make,执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为,TAB,字符。,中英文日报导航站 ,除非特别指定,否则,make,的工作目录就是当前目录。,target,是需要创建的二进制文件或目标文件,,dependency,是在创建,target,时需要用到的一个或多个文件的列表,命令序列是创建,target,文件所需要执行的步骤,比如编译命令。,Makefile,规则的一般形式如下:,target,:,dependency dependency,(tab),例如,有以下的,Makefile,文件:,#,一个简单的,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,中常用的一种专用目标,即删除所有的目标模块。,现在来看一下,make,做的工作:首先,make,按顺序读取,makefile,中的规则,然后检查该规则中的依赖文件与目标文件的时间戳哪个更新,如果目标文件的时问戳比依赖文件还早,就按规则中定义的命令更新目标文件。如果该规则中的依赖文件又是其他规则中的目标文件,那么依照规则链不断执行这个过程,直到,Makefile,文件的结束,至少可以找到一个不是规则生成的最终依赖文件,获得此文件的时间戳,然后从下到上依照规则链执行目标文件的时间戳比此文件时间戳旧的规则,直到最顶层的规则。,中英文日报导航站 ,通过以上的分析过程,可以看到,make,的优点,因为,.,o,目标文件依赖,.,c,源文件,源码文件里一个简单改变都会造成那个文件被重新编译,并根据规则链依次由下到上执行编译过程,直到最终的可执行文件被重新连接。例如,当改变一个头文件的时候,由于所有的依赖关系都在,Makefile,里,因此不再需要记住依赖此头文件的所有源码文件,,make,可以自动的重新编译所有那些因依赖这个头文件而改变了的源码文件,如果需要,再进行重新连接。,3,Makefile,中的变量,Makefile,里的变量就像一个环境变量。事实上,环境变量在,make,中也被解释成,make,的变量。这些变量对大小写敏感,一般使用大写宇母。几乎可以从任何地方引用定义的变量,变量的主要作用如下:,保存文件名列表。在前面的例子里,作为依赖文件的一些目标文件名出现在可执行文件的规则中,而在这个规则的命令行里同样包含这些文件并传递给,gcc,做为命令参数。如果使用一个变量来保存所有的目标文件名,则可以方便地加入新的目标文件而且不易出错。,保存可执行命令名,如编译器。在不同的,Linux,系统中存在着很多相似的编译器,系统,这些系统在某些地方会有细微的差别,如果项目被用在一个非,gcc,的系统,里,则必须将所有出现编译器名的地方改成用新的编译器名。但是如果使用一个变量来代替编译器名,那么只需要改变该变量的值。其他所有地方的命令名就都改变了。,中英文日报导航站 ,保存编译器的参数。在很多源代码编译时,,gcc,需要很长的参数选项,在很多情况下,所有的编译命令使用一组相同的选项,如果把这组选项使用一个变量代表,那么可以把这个变量放在所有引用编译器的地方。当要改变选项的时候,只需改变一次这个变量的内容即可。,Makefile,中的变量是用一个文本串在,Makefile,中定义的,这个文本串就是变量的值。只要在一行的开始写下这个变量的名字,后面跟一个“”号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:,VARNAME=string,使用时,把变量用括号括起来,并在前面加上,$,符号,就可以引用变量的值:,$,VARNAME,make,解释规则时,,VARNAME,在等式右端展开为定义它的字符串。变量一般都在,Makefile,的头部定义。按照惯例,所有的,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,除用户自定义的变量外,,make,还允许使用环境变量、自动变量和预定义变量。使用环境变量的方法很简单,在,make,启动时,,make,读取系统当前已定义的环境变量,并且创建与之同名同值的变量,因此用户可以像在,shell,中一样在,Makefile,中方便的引用环境变量。需要注意的是,如果用户在,Makefile,中定义了同名的变量,用户自定义变量将覆盖同名的环境变量。此外,,Makefile,中还有一些预定义变量和自动变量,但是看起来并不像自定义变量那样直观。表,9-3,中给出了常见的自动变量。,中英文日报导航站 ,除了自动变量外,,Makefile,中还有一些预定义的内部变量,用于定义编译命令名、编译参数等,如表,9-4,所示:,4,Makefile,的隐含规则,在上面的例子中,几个产生目标文件的命令都是从“,.,c”,的,C,语言源文件和相关文件通过编译产生“,.,o”,目标文件,这也是一般的步骤。实际上,,make,可以使工作更加自动化,也就是说,,make,知道一些默认的动作,它有一些称作隐含规则的内置的规则,这些规则告诉,make,当用户没有完整地给出某些命令的时候,应该怎样执行。,例如,把生成,prog,.o,和,code.o,的命令从规则中删除,,make,将会查找隐含规则,然后会找到并执行一个适当的命令。由于这些命令会使用一些变量,因此可以通过改变这些变量来定制,make,。,象在前面的例子中所定义的那样,,make,使用变量,CC,来定义编译器,并且传递变量,CFLAGS,(,编译器参数)、,CPPFLAGS,(,C,语言预处理器参数)、,TARGET_ARCH,(,目标机器的结构定义)给编译器,然后加上参数,-,c,,,后面跟变量,$,(第一个依赖文件名),然后是参数,-,o,加变量,$,(目标文件名)。综上所述,一个,C,编译的具体命令将会是:,$ ,CC $ CFLAGS $ CPPFLAGS $ TARGET_ARCH c $ -o $,中英文日报导航站 ,在上面的例子中,利用隐含规则,可以简化为:,OBJS=,prog,.o code.o,CC=,gcc,test,:,$ OBJS ,$ CC o $ $,prog,.o,:,prog,.c,prog,.h code.h,code.o,:,code.c code.h,clean,:,rm,f *.o,5,、常用的,make,命令行选项,make,命令有丰富的命令行选项。表,9-5,中列出了常用的部分。,中英文日报导航站 ,9.3.3,使用,automake,和,autoconf,产生,Makefile,在开始使用,Automake,和,autoconf,之前,请先确认系统已经安装以下的软件:,GNU,Automake,GNU,Autoconf,GNU m4,Perl,GNU,Libtool,(,如果你需要产生,shared library),Automake,所产生的,Makefile,除了可以做到程序的编译和连接,也已经把如何产生程序文件的操作,以及把安装程序都考虑进去了,所以源程序所存放的目录架构最好符合,GNU,的标准惯例,下面用,hello.c,来作为例子进行说明。,在工作目录下建立一个新的子目录,devel,,,再在,devel,下建立一个,hello,的子目录,这个目录将作为存放,hello,这个程序及其相关文件的地方:,中英文日报导航站 ,用编辑器写个,hello.c,文件:,#,include ,int,main(,int argc, char*,argv,),printf,(Hello, GNU!n);,return 0;,接下来就要使用,Autoconf,及,Automake,来产生,Makefile,文件,步骤如下:,(,1,),autoscan,产生一个,configure.in,的模板,执行,autoscan,后会产生一个,configure.scan,的文件,可以用它做为,configure.in,文件的模板:,(,2,)编辑,configure.scan,文件,如下所示,并且把文件名改成,configure.in,(,3,)执行,aclocal,和,autoconf,,,分别会产生,aclocal,.m4,及,configure,两个文件:,(,4,)编辑,Makefile,.am,文件,内容如下:,(,5,)执行,automake,-add-missing,,,Automake,会根据,Makefile,.am,产生一些文件,包含最重要的,Makefile,.in,:,中英文日报导航站 ,(,6,)最后执行,./,configure,:,现在你的目录下已经产生了一个,Makefile,文件,执行,make,命令就可以开始编译,hello.c,成执行文件,最后执行,./,hello,:,# make,gcc,-DPACKAGE=hello -DVERSION=1.0 -I. -I. -g -O2 -c hello.c,gcc,-g -O2 -o hello hello.o,# ./hello,Hello! GNU!,9.4,调试工具,GDB,9.4.1,GDB,调试器简介,Linux,系统中包含了,GNU,调试程序,gdb,,,它是一个用来调试,C,和,C+,程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。,gdb,所提供的一些功能如下所示:,运行程序,设置所有的能影响程序运行的参数和环境;,控制程序在指定的条件下停止运行;,中英文日报导航站 ,当程序停止时,可以检查程序的状态;,修改程序的错误,并重新运行程序;,动态监视程序中变量的值;,可以单步执行代码,观察程序的运行状态。,gdb,的功能非常强大,到目前为止,,gdb,已能够支持,Moduls,-2,、,Chill,、,Pascal,和,FORTRAN,程序的调试,但是调试这些语言的源程序时有一些功能还不能使用。例如调试,FORTRAN,程序时还不支持表达式的输入、输出变量或类,FORTRAN,的词法。,gdb,程序调试的对象是可执行文件,而不是程序的源代码文件。然而,并不是所有的可执行文件都可以用,gdb,调试。如果要让产生的可执行文件可以用来调试,需在执行,gcc,指令编译程序时,加上,-,g,参数,指定程序在编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。,gdb,利用这些信息使源代码和机器码相关联。,在命令行上输入,gdb,并按回车键就可以运行,gdb,了,如果一切正常的话,将启动,gdb,,,可以在屏幕上看到以下的内容:,中英文日报导航站 ,GNU,gdb,Red Hat Linux (5.3post-0.20021129.18rh),Copyright 2003 Free Software Foundation, Inc.,GDB is free software, covered by the GNU General Public License, and you are,welcome to change it and/or distribute copies of it under certain conditions.,Type show copying to see the conditions.,There is absolutely no warranty for GDB. Type show warranty for details.,This GDB was configured as i386-,redhat,-,linux,-gnu.,(,gdb,),启动,gdb,后,可以在命令行上指定很多的选项。输入:,help,可以获得,gdb,的帮助信息。如果想要了解某个具体命令(比如,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 机械制造 > 工业自动化


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

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


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