第4章Linux环境中的程序设计基础ppt课件_第1页
第4章Linux环境中的程序设计基础ppt课件_第2页
第4章Linux环境中的程序设计基础ppt课件_第3页
第4章Linux环境中的程序设计基础ppt课件_第4页
第4章Linux环境中的程序设计基础ppt课件_第5页
已阅读5页,还剩165页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,Linux环境中的程序设计基础,使用vi编辑文件,.,vi编辑器使用,vieditor是一个全屏幕文本编辑器所有的Linux版本都提供了这一编辑器在Linux系统中使用vi来编写文本文件vi也是Unix世界里极为普遍的全屏幕文本编辑器,.,vi的启动,格式:vioptionsfilename功能:自动载入所要编辑的已有文件,或开启一个新文件输出:如果未指定选项或文件,将进入vi程序并开始编辑一个新缓冲区。当屏幕的左边出现“”号,表示本行为空行。常用选项/功能:+n从第n行开始编辑文件+/exp从文件中匹配字符串exp的第一行开始编辑,.,shell程序文件的建立实例,用vi编辑器建立shell程序文件shex1的步骤:键入命令“vishex1”,启动vi;按命令“i”,进入vi的插入状态;输入程序文件内容;clearcal198cal298cal398按键,再键入“:”,切换到vi的命令状态;在“:”后键入命令“wq”,即保存文件内容后,退出vi,.,vi的2种状态,进入vi后有2种状态:“编辑”状态和“一般命令”状态。编辑状态在此状态下输入文本编辑命令,输入文本文字信息。一般命令状态在此状态下键入的都是命令,这些命令用来下达一些文件存档、以及离开vi等等的操作指令。当进入vi,先在编辑状态,等待编辑命令的输入。2种状态的转换任何情况下,按“ESC”键就进入编辑命令状态,光标定位在文档中,等待编辑命令的输入。在编辑命令状态下,按“:”键,进入一般命令状态,屏幕左下方出现“:”提示符,等待输入一般命令。,.,编辑状态下的文字输入,在编辑状态下,有光标闪动,这是文字插入点。在编辑状态下,输入以下编辑命令,便进入插入模式:a:从光标所在位置后开始追加文字,光标后的文字随追加的文字向后移动。i:从光标所在位置前开始插入文字,光标后的文字随追加的文字向后移动。o:在光标所在行下方新增一行,并进入编辑状态。编辑状态下输入文字时,有2种模式:“插入”与“改写”,按“Insert”键即可转换状态。编辑状态下按“ESC”键,就退出插入模式。此时输入“/”,进入一般命令状态,然后输入欲搜索的字符再按回车键,光标将指向文本中与字符匹配的地方。,.,vi下有多种编辑命令可完成以下功能:删除与恢复修改剪贴板查找与替换光标移动寻找、搜索但记住编辑命令是麻烦的,实际上,在命令模式下移动方向键就可以移动光标;按Delete键与backspace键就可删除字符。,.,在一般命令状态下,键入以下命令:q结束编辑(打开的文档未作任何修改),退出viq!放弃编辑不作保存(打开的文档已编辑过),退出viwq保存当前文件后退出viwq!强制性保存当前文件(包括只读文件)后退出viwfilename用于对新建文件(直接键入vi)或当前正编辑的文件作保存后继续编辑e当前没有未保存的修改,则进入由指出的文件进行编辑e!即使有未保存的修改,也不作保存,进入由指出的文件进行编辑,退出vi,.,删除与恢复,在编辑状态下,对文档内容作删除操作的命令:x删除当前光标所在位置的字符,功能同“Del”键。dw删除当前光标所在位置的单词。dd删除当前光标所在的行,注意:dd是按两次d。d$删除当前光标所在位置至本行结尾的所有字符。dG删除当前光标所在位置至文件结尾处的所有字符。恢复是指对误删除的恢复,在编辑状态下,若要恢复误删除的内容,则使用命令u。,.,修改,R键入R,然后键入修改后的单词。r改写光标所在处的单个字符。用来改变光标所在处的字符的大小写。,.,剪切、复制、粘贴,yy将光标所处行选中,并复制到系统剪贴板上。c即cut,是将光标所处行移到剪贴板上,原行内容在屏幕上消失。p即paste,是将剪贴板上的内容复制到光标所在行。,.,查找和替换,vi中也可进行查找和替换,这无疑为修改相同的字符串带来了方便,vi的查找和替换功能是在命令方式下实现的,其命令如下:s/需替换内容/修改后内容/需改内容所在行号注意:在查找替换操作前,必须将光标移至文件首。,例:用“Aftercompletion”来替换“OnceIhavecompletedit.”,.,shell程序运行的2种方法,运行shell程序有两种方法:在shell环境下,将shell程序文件作为子shell程序被调用执行$sh例:$shshex1,.,将shell程序文件视作命令来执行(因此,shell程序文件可以看作是将各种命令组合在一起而形成的新命令),此时必须赋予shell程序文件执行权限$例:$chmoda+xshex1给程序文件赋予可执行属性$/home/user1/shex1以完整的路径名键入程序名或$./shex1以相对路径名键入程序名,.,带参数的运行命令,运行命令中有参数和无参数的2种情况,分别称为带参数的运行命令和不带参数的运行命令在shell程序中一般使用的形参为:$0、$1、$2、$9,共10个当程序运行时,命令行中的、依次赋值给$1、$2、,通常称运行命令中所带的参数为实参$0是一个特殊的形参,其值规定为当前运行的shell程序命令本身,.,例:建立shell程序shex3,其内容为:clearcal$198cal$298cal$398执行时输入命令的形式为:$shshex3123第一个实参值是1,运行时代换给程序中的形参$1,第二个实参值是2,运行时代换给程序中的形参$2,第三个实参值是3,运行时代换给程序中的形参$3,.,命令shift作用,由于形参个数有限(一般为10个),当参数较多时,可通过命令shift来移动形参与实参的对应关系执行一次shift后,$1、$2、变为依次与对应再执行一次shift后,$1、$2、变为依次与对应,依此类推,.,例:建立shell程序shex2,其内容为:echo$0$1$2shiftecho$0$1$2运行时情况如下:#/root/shex2yesterdaytodaytomorrow/root/shex2yesterdaytoday/root/shex2todaytomorrow#可见:$0始终是当前运行的shell程序命令本身,即/root/shex2,.,内部变量:由系统提供,用户不能修改。,用户变量:由用户建立和修改,在shell脚本编写中会经常用到。是在当前shell中使用的局部变量,不能被在shell下运行的其他命令或其它shell程序使用,环境变量:这些变量决定了用户工作的环境,它们不需要用户去定义,可以直接在shell中使用,其中某些变量用户可以修改。它可将值传给shell运行的其他命令或shell程序使用,也就是说系统变量是全局变量,shell变量大致可以分为三类:内部变量、用户变量和环境变量。,Shell变量,.,常见的Shell变量,.,常见的Shell变量,.,PATH变量是最重要的环境变量之一。当用户在命令行中输入命令时,shell就会根据该变量定义的路径(目录)和顺序,查找并执行该命令。如果没有正确设置PATH变量,则必须输入完整的路径名来运行某个命令。,用户可以根据需要修改环境变量如:HISTSIZE,PATH,PS1,PS2等,在Linux下输入命令的两种方式:,直接在命令行中输入命令:根据PATH查找该命令输入完整的路径名,Shell变量,.,查询当前shell中的环境变量:env,env,查询某个变量的值:echo,echo$变量名,Shell变量查询,.,重设PS1和PS2的设置,例:exportPS1=“tw$”,在bash中,有两个级别的命令输入提示:,export使变量的值对当前shell及其所有子进程都可见,命令提示符,一级提示符是当bash等待输入命令时所出现的提示符,由环境变量PS1控制,缺省值为“$”;二级提示符是在bash执行一个命令后,需要用户进一步输入才能完成次命令时,所出现的提示符,由环境变量PS2控制,缺省值为“”。,.,在创建提示符时,可以使用下面的特殊字符:,命令提示符,.,在启动交互式会话过程中,在出现提示符前,系统会读取几个配置文件,并执行这些文件中的命令。所以这些文件可以用来定制bash环境。如:设置shell变量值或建立别名等。,bash配置文件:,在命令行中设置和修改的变量值,只在当前的shell中有效。一旦用户退出bash,所做的一切改变都会丢失。,bash配置文件,bash配置文件,/etc/profile,/.bash_profile/.bash_login/.profile,/.bashrc,.,/etc/profile,bash配置文件,读取/etc/profile文件后,bash将在用户主目录中按顺序查找以下文件,并执行第一个找到的文件:,Linux系统中的全局bash启动脚本,任何用户登录系统时/etc/profile都会被执行。通常用来设置标准bash环境,但修改该文件需root权限。,/.bash_profile/.bash_login/.profile,在这些文件中,用户可以定义自己的环境变量,而且能够覆盖在/etc/profile中定义的设置。,.,bash启动后,将读入配置文件/.bashrc,并执行这个文件中的所有内容。,bash配置文件,另外,还可以从另一个shell或者bash自身启动一个新的bash,这种过程称为非登录交互式,启动新bash的命令为bash,此时所读入的唯一bash配置文件是/.bashrc,通常,个人bash环境设置都定义在/.bashrc文件里,.,变量,.,变量赋值,格式:=功能:将等号右边的字符串赋给等号左边的变量变量名可以由任意字符、数字或下划线组成,但数字不能作为变量名的首字符。变量名不能包含空格、惊叹号字符变量名不能使用shell中保留的关键词等符号变量名不能多于一个词,因为shell使用空格分析命令、定界命令名和参数,所以若字符串中含有空格,则在字符串上加上引号例:name1=MARYname2=XWindow,.,变量,.,变量举例,.,例:,$是特殊变量,用来存储当前运行进程的PID,局部变量和作用域,.,引用变量,格式:$功能:引用变量的值。只要在变量名前加上“$”字符,变量名即将变量值取代例:#name2=$name1将变量name1值赋予变量name2#echo$name1在屏幕上显示变量name1的值,.,单引号和双引号允许用户一次把几个字符引起来。双引号不可以把美元符$引起,因为$操作符将导出变量所代表的值。如果已包含在双引号中有$字符,并紧跟变量名,则在执行shell命令时,字符串中的变量将被变量所代表的数值所取代例:#winner=david#notice=Thepersonwhowonis$winner.#echo$notice显示结果为:Thepersonwhowonisdavid.,.,但若用户不希望求出包含在字符串中的变量的值,在这种情况下,应该使用单引号作为字符串的定界符。单引号将抑制任何变量值,并把美元符看成另一个字符例:#winner=david#notice=Thenameisinthe$winnervariable.#echo$notice显示结果为:Thenameisinthe$winnervariable.,.,若要将美元符使用,可以加上反斜杠来引导$操作符例:#winner=david#result=$winnerwon$100.00#echo$result显示结果为:davidwon$100.00.,.,释放变量,格式:unset功能:释放一个现存的shell变量。要慎用unset*,因为它将删除全部shell变量例:#unsetname1,.,例:,只读变量,.,变量被创建时所处的shell称为父shell。如果在父shell中启动一个新的shell(或进程),则该shell(或进程)被称为子shell(或子进程)。,环境变量,环境变量就象DNA,可以从父亲传递给儿子,再到孙子,但不能从子进程传递给父进程。,.,export:使变量的值对当前shell的所有子进程都可见。说明:设置或显示环境变量。语法:export选项变量名称=变量设置值该命令的各选项含义如下:-f代表变量名称中为函数名称;-n删除指定变量,变量实际未删除,只是不输出到后续指令的执行环境中;-p列出所有shell赋予程序的环境变量。,.,环境变量举例,例:,将全局变量转换成局部变量,列出所有全局变量,.,declare常用选项,内置命令declare,.,declarermyname=jypanunsetmynamedeclaremyname=JianyuPan,declare,declare举例,.,printf可用来按指定的格式输出变量,printfformat输出参数列表,printf的打印格式与C语言中的printf相同,printf%-12.5fn123.456,format以%开头,flag,fieldwidth,precision,格式符,-:左对齐+:输出符号0:空白处添0空格:前面加一空格,字段宽度,小数点后输出位数,printf命令,.,printf命令的格式说明符,format中还可以使用,printf命令,.,printfThenumberis:%.2fn100,printf%-20s|%12.5f|nJoy10,printf%-10d%010o%+10 xn202020,printf%6dt%6o%6xn202020,printf命令举例,例:,.,shell提供一些专用的修饰符来检查某个变量是否已被设置,然后根据测试结果指定变量的值,也称变量置换,变量测试,.,color=bluenewcolor=$color:-grey,unsetcolorechoTheskyis$color:-greytodayecho$color,echoTheskyis$color:=greytodayecho$color,echoTheskyis$color:?errortodayecho$color,echoTheskyis$color:+bluetodayecho$color,变量测试举例,例:,.,位置参量是一组特殊的内置变量,通常被shell脚本用来从命令行接受参数,或被函数用来保存传递给它的参数。,执行shell脚本时,用户可以通过命令行向脚本传递信息,跟在脚本名后面的用空格隔开的每个字符串都称为位置参量。,在脚本中使用这些参数时,需通过位置参量来引用。例如:$1表示第一个参数,$2表示第二个参数,以此类推。$9以后需要用花括号把数字括起来,如第10个位置参量以$10的方式来访问。,位置参量(命令行参数),.,位置参量列表,.,例1:显示位置参量的值。(shprg1.sh),例2:$*与$的区别:二者仅在被双引号括起来时有区别,此时前者将所有位置参量看成一个字符串,而后者将每个位置参量看成单独的字符串。(shprg2.sh),位置参量举例,.,shprg3.sh,basename,.,如何通过str2的值来引用str1的值?(间接引用),str1=HelloWorldstr2=str1echo$str2,echo$str2?echo$str2?,evalnewstr=$str2echo$newstr,newstr=$!str2bash2.0以上才支持echo$newstrecho$!str2,脚本范例:args3.shHelloworld!,变量的间接引用,.,listpage=ls-l|more$listpage,listpage=ls-l|moreeval$listpage,evalnewstr=$str2,eval,evalarg1arg2.argN,将所有的参数连接成一个表达式,并计算或执行该表达式,参数中的任何变量都将被展开。,.,命令替换的用处是将命令的输出结果赋给一个变量,或者用命令的输出结果代入命令所处的位置。,命令替换,.,Shell脚本,Shell脚本的编写,shell脚本,当命令不在命令行中执行,而是从一个文件中执行时,该文件就称为shell脚本,即按顺序执行的Linux命令集。shell脚本按行解释。,Shell脚本是纯文本文件,可以使用任何文本编辑器编写Shell脚本通常是以.sh作为后缀名,Shell脚本的执行,chmod+xscript_name./script_name,shscript_name,.,状态变量$?中保存命令退出状态的值,grep$USER/etc/passwdecho$?grephello/etc/passwd;echo$?,条件测试,条件测试可以根据某个特定条件是否满足,来选择执行相应的任务。,Bash中允许测试两种类型的条件:命令成功或失败,表达式为真或假,任何一种测试中,都要有退出状态(返回值),退出状态为0表示命令成功或表达式为真,非0则表示命令失败或表达式为假。,.,内置测试命令test,通常用test命令来测试表达式的值,x=5;y=10test$x-gt$yecho$?,test命令可以用方括号来代替,x=5;y=10$x-gt$yecho$?,表达式测试包括字符串测试、整数测试和文件测试。,测试表达式的值,方括号前后要留空格!,.,name=Tom$name=Tt?echo$?,2.x版本以上的Bash中可以用双方括号来测试表达式的值,此时可以使用通配符进行模式匹配。,测试表达式的值,$name=Tt?echo$?,.,字符串测试,name=Tom;-z$name;echo$?,操作符两边必须留空格!,字符串测试,name2=Andy;$name=$name2;echo$?,.,整数测试,即比较大小,x=1;$x-eq1;echo$?,x=a;$x-eq1;echo$?,整数测试,操作符两边必须留空格!,X,.,整数测试也可以使用let命令或双圆括号,x=1;let$x=1;echo$?,x=1;($x+1=2);echo$?,只能用于整数测试!,整数测试,相应的操作符为:,=、!=、=、Tom;echo$?,.,编程小结:条件测试,整数测试,注意这两种方法的区别!,.,编程小结:条件测试,逻辑测试,如果使用双方括号,可以使用通配符进行模式匹配。,.,编程小结:条件测试,文件测试,.,编程小结:控制结构,if条件语句case选择语句for循环语句while循环语句until循环语句break、continue、sleep命令select循环与菜单shift命令,$.,$(.),$.,$(.).,.,(.),各种括号的作用,.,条件判断命令test,条件表达式是控制程序流程的关键,shell提供的test命令适用于条件控制流和循环控制流格式:test功能:返回表达式成立与否的状态值,如果表达式成立,则test返回真的状态值0,反之,test返回假的状态值,即一个非0值。(常用的表达形式见书P.147),.,例:判断文件/etc目录下文件profile是否存在test-e/etc/profile当运行shell程序shex时,判断是否带参数test-z$1(-z如字符串长度为0,返回真值)判断变量value是否大于等于1并小于3testvaluege1-avalue-lt3(-a与操作-eq等于返回真-ge大于或等于返回真),.,条件控制流,if-then-else结构ifthenelsefi,通常采用“test”,当条件成立,则返回0;条件不成立,则返回一个非0值注意:其中if和fi必须配对出现,if-then-fi结构ifthenfi,.,例:如果/etc目录中的文件profile存在,则将其复制到/home中,并分屏显示/home下的profile内容;否则在屯幕上显示信息“profileisnotexist!”iftest-e/etc/profilethencp/etc/profile/homecat/etc/profile|moreelseecho“profileisnotexist!”fi,.,建立程序文件shp3,存放在当前目录下。如果shp3运行时未带参数,则在屏幕上显示信息“Parameterislost!”,并结束程序运行;如果shp3运行时带一个参数,则判断参数所指定的文件是否存在,如果存在则复制该文件到/home;否则先在屏幕上显示信息“Filenotfound!”,然后显示程序本身。,.,iftest-z$1-z判$1存在否thenechoParameterislost!如带一参数elseiftest-e$1则$1肯定在thencp$1/homeelseechoFilenotfound!cat$0$0指程序本身fifi,.,例:编写shell程序shp6,存放在当前目录下。运行shp6时带一个正整数参数,将数值存入变量value;如果该参数大于等于1但小于3,则在屏幕上显示“valueislessthan3andnotlessthan1”;如果该参数大于等于3,则在屏幕上显示“valueisnotlessthan3”;最后以“value=xx”的形式显示变量value的值。,.,value=$1iftestvalue-ge1-avalue-lt3thenechovalueislessthan3andnotlessthan1fiiftestvalue-ge3thenechovalueisnotlessthan3fiechovalue=$value,.,例:编1个shell程序shp10,当以命令“shp10 xxyy”执行时,(其中xx为年份参数,yy为季度参数),能自动清屏,并显示指定年份指定季度中的3个月的月历。,.,cleark=$2iftest$k-eq1thencal1$1cal2$1cal3$1fiiftest$k-eq2thencal4$1cal5$1cal6$1fi,iftest$k-eq3thencal7$1cal8$1cal9$1fiiftest$k-eq4thencal10$1cal11$1cal12$1fi,.,case结构casein字符串1);字符串n);*);esac说明:其中,字符串中可含通配符。如果能同时匹配多个字符串,则只能执行第一个匹配字符串后的。,.,循环控制流,for-in结构forindodone其中,中的值与值之间用空格分隔。,.,例:用for命令实现,在当前目录下创建名为user0、user1、user9十个子目录,用长格式显示这10个目录的目录信息,然后用for命令删去这10个目录后,再用长格式显示这10个目录的目录信息。foriin0123456789domkdiruser$idonels-dluser?|moreforiin0123456789dorm-rfuser$idonels-dluser?|more,.,例:(1)清屏(2)当程序运行时,屏幕显示如下形式信息:*Thisisashellprogram*(3)检查/home目录下,是否存在由参数1指定的文件,若不存在,则屏幕显示信息“Filenotfound!”;若存在,则将参数1指定的文件改名为由参数2指定的文件名,然后用for命令对改名后的文件显示其长格式的目录信息和文件内容,.,clearecho“*”echo“*Thisisashellprogram*”echo“*”,.,iftest-n$1-a-n$2theniftest$1!=$2theniftest-e$1thenmv$1$2forcnin“ls-l”“cat”do$cn$2echo“”doneelseechoFilenotfound!fififi,.,while结构whiledodone说明:当返回0时,则执行一轮由do和done括起来的循环体中的,直到返回一个非0值时,则不再执行循环体中的命令,执行done后面的命令,.,until结构untildodone执行过程说明:与while结构相反,当返回非0时,执行循环体中的命令,直到返回一个0值时,继续执行done后面的命令。,.,shell程序的调试,有两种简便的跟踪功能可以用于shell程序的调试格式1:set-v功能:当执行一个shell程序时,会在执行程序文件中的每条命令之前,自动在屏幕上先显示该条命令格式2:set-x功能:当执行shell程序时,它会把将要执行的命令逐条进行参量定值,并以最后执行的形式在屏幕上显示,.,Linux环境中的程序设计基础,Linux编程环境,.,LinuxC/C+编程,C语言是一种在Unix操作系统中被广泛使用的通用编程语言。用C语言写的程序执行速度很快。C语言非常适合编写系统程序,Linux内核就是使用C语言编写的。ANSIC的C语言标准目标是为各种操作系统上的C程序提供可移植性保证,而不仅仅限于Unix。不仅定义了C编程语言的语法和语义,还定义了一个标准库。,.,标准库可以根据头文件划分为15个部分,其中包括字符类型、错误码、浮点常数、数学常数、标准定义、标准I/O、工具函数、字符串操作、时间和日期、可变参数表、信号、非局部跳转、本地信息及程序断言等。,.,C语言开发环境简介,Linux上广泛使用的C语言编译器是GNUC编译器,GNUC建立在自由软件基金会的编程许可证的基础上,可以自由发布。在Linux下,一个完整的C语言开发环境到少包括以下三个组成部分:函数库glibc编译器gcc系统头文件glibc_headerglibc是构成一个完整的C语言开发环境所必不可少的组成部分,也是Linux下C语言的主要函数库。glibc_header中包含了系统编译源代码所需要的声明文件,如果缺少系统头文件,很多用到系统功能的C程序将无法编译。,.,glibc有两种安装方式:安装成测试用的函数库在编译程序时用不同的选项来试用新的函数库。安装成主要的C语言函数库所有新编译程序均使用的函数库。gcc是可以在多种硬件平台上编译出可执行程序的超级编译器,gcc编译器能将C语言、C+语言源程序、汇编语言程序和目标程序编译、连接成可执行文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类型。,.,gcc支持编译的一些源文件的后缀及其说明:,.,在Linux中,gcc(GNUCCompiler)是C、C+、Objective-C源程序的编译器,gcc编译C源程序并生成可执行文件要经过以下四步:(1)预处理gcc编译器调用cpp程序,对各种命令如#define、#include进行分析。(2)编译gcc编译器调用ccl程序,根据输入文件产生中间文件。(3)汇编gcc编译器调用as程序,用中间文件作为输入产生以.o作为类型名的目标文件。(4)连接gcc编译器调用ld程序,将各目标程序组合于可执行文件中的适当位置,这一程序引用的函数也放在可执行文件中。,.,C函数库,定义:是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常是一组相互关联的用来完成某项常见工作的函数构成(比如c库里面的标准输入输出函数、时间函数和数学函数等)。函数库中的函数可以通过连接程序与应用程序进行连接,而不必在每次开发程序时都对这些通用的函数进行编译。不同类型的应用程序将会使用不同的函数库。如数学应用将使用数学库libm,X-Window应用程序将使用Xlib库及libX11。,.,所有的程序都将使用标准的C函数库-libc,该库中包含了内存管理或输入输出操作的基本函数,这些库都存放在/usr/lib这些系统公用的目录中,系统中的任何用户都可以利用这些库。库可以有三种使用的形式:静态库:代码在编译时就已连接到开发人员开发的应用程序中。共享库:只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。动态库:是共享库的另一种变化形式,也是在程序运行时载入,使用的库函数不是在程序运行开始,而是在程序中的语句需要使用该函数时才载入。,.,动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其他程序使用。由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。已经开始的大多数库都采用共享库的方式。ELF格式的可执行文件使得共享库能够比较容易地实现,当然使用旧的a.out模式也可以实现库的共享。Linux系统中目前可执行文件的标准格式为ELF格式。,.,系统中可用的库都存放在/usr/lib和/lib目录中。库文件名由前缀lib和库名以及后缀组成。根据库的类型不同,后缀名也不一样。共享库的后缀名由.so和版本号组成,静态库名的后缀名为.a或.sa(采用旧的a.out格式的共享库)。共享库名的格式:库的名称.so.主版本号.次版本号静态库名的格式:库的名称.a例如:libm.so.5数学共享库的标识字符为m,版本号为5libm.a静态数字库,.,库文件与头文件的位置,函数库存放的标准目录:/lib系统必备共享库/usr/lib标准共享库和静态库/usr/i486-linux-libc5/liblibc5兼容性函数库/usr/X11R6/libX11R6的函数库/usr/local/lib本地函数库头文件存放的目录:/usr/include系统头文件/usr/local/include本地头文件共享库及相关配置文件在/etc目录中,其中:ld.so.conf包含共享库的搜索位置ldconfig共享库管理工具,一般在更新了共享库之后要运行该命令ldd可查看可执行文件所使用的共享库,.,gcc的基本用法和选项,格式:gccoptionsfilename常用选项的说明:-ansi只支持ANSI标准的C语法。这一选项将禁止GNUC的某些特色,例如asm或typeof关键词。-c对源程序进行预处理、编译,产生目标文件,但不进行连接成为可执行文件。-DMACRO以字符串“1”定义MACRO宏。-DMACRO=DEFN以字符串“DEFN”定义MACRO宏。-E在预处理后停止,输出预处理后的源代码至标准输出,不进行编译。,.,-g产生一张用于调试和排错的扩展符号表,此选项使程序可用gdb进行调试。-o定义输出的执行文件名为-S在编译后停止,产生类型名为s的汇编代码文件,不生成中间文件。-O对程序编译进行优化,减少被编译程序的长度和执行时间,但此时的编译速度比不作优化慢且要求较多的内存。-lobjc可用于连接类型名为o的目标文件生成可执行文件。-w不生成任何警告信息-Wall生成所有警告信息。,.,/*程序清单main.c*/#include#includeintfactorial(intn);intmain(intargc,char*argv)intn;if(argc2)printf(Usage:%snn,argv0);return-1;elsen=atoi(argv1);printf(Factorialof%dis%d.n,n,factorial(n);return0;,假设有两个源文件main.c和factorial.c,现在要编译生成一个计算阶乘的程序。,/*程序清单factorial.c*/#include#includeintfactorial(intn)if(n=1)return1;elsereturnfactorial(n-1)*n;,$gcc-ofactorialmain.cfactorial.c$./factorial5Factorialof5is120.,.,GCC可同时用来编译C程序和C+程序。一般来说,C编译器通过源文件的后缀名来判断是C程序还是C+程序。在Linux中,C源文件的后缀名为.c,而C+源文件的后缀名为.C或.cpp。但是,gcc命令只能编译C+源文件,而不能自动和C+程序使用的库连接。因此,通常使用g+命令来完成C+程序的编译和连接,该程序会自动调用gcc实现编译。假设我们有一个如下的C+源文件(hello.C):#includevoidmain(void)coutHello,world!endl;,$g+-ohellohello.C$./helloHello,world!,.,调试C程序,当编译后得到的目标程序在运行时出现故障时,需要对你的源程序进行调试以找出错误,排除故障。Linux提供了调试源程序的工具gdb(GNUdebugger)。GNU的调试器称为gdb,该程序是一个交互式工具,工作在字符模式。在XWindow系统中,有一个gdb的前端图形工具,称为xxgdb。gdb是功能强大的调试程序,可完成如下的调试任务:设置断点;监视程序变量的值;程序的单步执行;修改变量的值。,.,gdb不仅允许用户在运行程序时显示源代码,而且在调试过程中允许在预设的断点处暂停程序的运行,显示变量的内容。在可以使用gdb调试程序之前,必须使用-g选项编译源文件。可在makefile中如下定义CFLAGS变量:CFLAGS=-g运行gdb调试程序时通常使用如下的命令:#gdbprogname,.,在gdb提示符处键入help,将列出命令的分类,主要的分类有:aliases:命令别名breakpoints:断点定义data:数据查看files:指定并查看文件internals:维护命令running:程序执行stack:调用栈查看statu:状态查看tracepoints:跟踪程序执行键入help后跟命令的分类名,可获得该类命令的详细清单。,.,gdb的常用命令,.,注意:在使用gdb调试程序前,必须使用gccg对源程序进行编译。,.,建立源程序文件star.c,输出结果如下*程序内容如下:#includeintmain()inti=10;doprintf(“*”);+i;while(i10);printf(“n”);,编译程序star.c,其目标程序以star命名且可用gdb进行调试,.,#gcc-ostar-gstar.c或#gcc-gstar.c-ostar#./star*为了查找该程序中的逻辑错误,使用gdb进行调试:#gdb./starGNUgdbRedHatLinux(gdb)run*(gdb)whereNostack,.,(gdb)list1#include2intmain()34inti=10;5do67printf(“*”);8+i;9while(i10);10printf(“n”);(gdb)break1Breakpoint1at0 x8048370:filestar.c,line1.(gdb)runBreakpoint1,main()atstar.c:33,.,(gdb)st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论