您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 北航计算机学院UNIX课件7第七章 c语言开发环境
第七章c语言开发环境一、概述自从1973年DennisRitchie发明C语言并用C语言改写了UNIX系统之后,C语言就与UNIX系统紧密结合在一起,成UNIX系统的“自然”语言。1988年,IEEE推出POSIX标准,C语言有了标准的头文件,也使得任何UNIX系统都提供C语言编程环境。因此,对许多应用而言,C语言总是首选。第七章c语言开发环境----概述二、实例分析/*traditionalfirstcprogram*/#includestdio.hintmain(argc,argv)intargc;char*argv[];{printf(helloworld!\n);return0;}第七章c语言开发环境----实例分析注释/*traditionalfirstcprogram*//**/之间为注释,用于阅读,编译器忽略这些内容。预编译指令#includestdio.h告诉编译程序,在编译之前在“常见位置”寻找stdio.h,将其内容包含到程序中。#为预编译指令,告诉编译程序其后的内容在编译之前需要处理。include表示包含某个文件表示“常见位置”,通常为/usr/include.如果文件在其它位置,应使用””号。如#include“myhead.h”。stdio.h为标准输入/输出头文件,其中包含了main函数所使用的printf函数第七章c语言开发环境----实例分析主函数intmain(argc,argv)任何c程序必须有一个main函数,程序从main函数开始执行。主函数参数intargc;char*argv[];主函数参数是命令行的参数,argc是参数的数量,argv是各个参数所组成的数组。良好的习惯:对于输入数据,如果给出了输入文件,则从该文件读入数据,否则从标准输入读入数据;对于输出数据,如果给出了输出文件,则输出至该文件,否则输出至标准输出文件。----这样便于使用管道来连接命令。第七章c语言开发环境----实例分析主函数返回值return0主函数最好声明为int类型。如果程序正常结束,主程序的返回值最好为0,否则返回-1或其它值。这样有利于shell编程。使用echo命令可以查看最后一条命令的返回值。$./a.out$echo$?第七章c语言开发环境----实例分析三、c编译c编译过程第一步,预处理。处理预处理指令,如#inlude、#define等,输出预处理后的源文件。第二步,编译。词法和语法分析,如果有错误,则给出提示终止编译;如果没有错误,则将源程序翻译成汇编代码(或其它中间代码)。汇编代码是以助记符来代替机器代码的一种代码。第三步,汇编。将汇编代码转换成机器代码,输出目标文件。第四步,连接。连接各目标文件,生成可执行程序。第七章c语言开发环境----编译c编译器UNIX系统中默认的c编译器为cc。在Ubuntu中,cc等同于gcc。$cchello.c//生成可执行程序./a.out$cc-ohellohello.c//生成可执行程序hello$ccp1.cp2.c//源程序由两个文件组成。编译p1.c和p2.c,生成./a.out$cc-cp1.c//编译p1.c,生成目标文件p1.o,不连接。$cc-ghello.c//编译hello.c,在目标文件中加入调试信息。第七章c语言开发环境----编译四、程序调试工具gdb简介gdb是GNU开源组织发布的一个UNIX下的程序调试工具。功能强大。主要功能包括:1)启动程序,可以按照自定义的要求运行程序。2)可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)3)当程序被停住时,可以检查此时你的程序中所发生的事。4)动态的改变你程序的执行环境。采用命令行界面。第七章c语言开发环境----gdb命令简介(gdb)//gdb命令提升符(gdb)help//显示gdb命令分类(gdb)helpbreakpoints//显示断点设置的相关命令(gdb)hb//同上。只要不引起歧义,gdb命令可以简写。(gdb)hebre//同上。----因此,gdb自带用户手册,可以在使用中边学便用。第七章c语言开发环境----gdb五、工程管理工具make简介功能:自动编译工程中的源文件,生成最终程序。在大型的软件开发过程中,软件由多个人开发,源程序包含很多个文件,这些文件在不断地更改,每一次编译的过程复杂,全部重新编译或重复某些不必要的编译是一件费时的过程,因此,“自动、合理的编译”显得十分重要。第七章c语言开发环境----makemake文件使用make命令来完成工程文件的编译,我们必须建立一个编译规则的描述文件,简称“make文件”。make文件的默认文件名为makefile、Makefile或GNUmakefile,也可以使用其它文件名。使用默认文件名时,只需执行命令make即可完成编译;使用其它文件名时,需要执行make-ffilename来完成编译。GNUmakefile默认文件名只能由GNUmake来识别,不推荐使用。第七章c语言开发环境----make编译规则一个例子p:p1.op2.ogcc-opp1.op2.op1.o:p1.cgcc-cp1.cp2.o:p2.cgcc-cp2.c上例中包含3条规则,每条规则包含一个文件依赖关系和一条命令。p:p1.op2.o表示文件p依赖文件p1.o和p2.o,如果这两个文件中的任何一个比文件p新(更改时间更晚),则执行规则中的命令gcc-opp1.op2.o第七章c语言开发环境----make规则的执行顺序。在默认情况下,make文件的第一条规则目标文件为终极目标文件。make根据终极目标文件中所依赖的文件逐级展开规则。对于所有所依赖的文件,make依次检查后续规则中是否有生成该文件的规则。如果有,则采用该规则;如果没有,则可能自动生成一条隐含规则,如p1.o:p1.c;gcc-cp1.c。如果文件不存在,又无法自动生成隐含规则,则报错。当终极目标的规则被完全展开后,make将从最后一个被展开的规则处开始执行,之后处理倒数第二个规则,依次回退,最后处理终极目标所在的规则。第七章c语言开发环境----make例1自动规则p:p1.op2.ogcc-opp1.op2.o$touchp1.c$make对于p1.o和p2.o,make自动生成如下规则p1.o:p1.c;gcc–c–op1.op1.c和p2.o:p2.c;gcc–c–op2.op2.c第七章c语言开发环境----make例2p:p1.op2.ogcc-opp1.op2.op1.o:p1.cechodonothing$touchp1.cp2.c$make$make由于p1.o的生成规则存在,make采用该规则,不再为这个依赖文件生成规则第七章c语言开发环境----make例3p:p1.op2.ogcc-opp1.op2.osig.o:sig.cgcc-csig.c$touchsig.c$makesig.o不是终极目标的依赖文件,其生成规则不采用。第七章c语言开发环境----make例4p:p1.op2.oxgcc-opp1.op2.o$make没有创建x的规则,也无法自动创建,错误!第七章c语言开发环境----make规则的一般形式目标文件:依赖文件1依赖文件2…tab命令1[#注释]tab命令2[#注释]……#一条规则可以执行多条命令,每条命令的行首必须是制表符(tab),make文件中可以有注释第七章c语言开发环境----make使用变量make文件中可以使用变量,这样更为简洁,避免出错。例如:#sample1objs=main.okbd.ocommand.odisplay.o\insert.osearch.ofiles.lountils.oedit:$(objs)cc-oedit$(objs)#用\将较长的行分解为多行。\取消换行符的作用,其后面不能有空格等字符,否则会出错(很隐蔽的错误)。#如果不定义变量,所有.o文件会写两次,繁琐,且容易出错。第七章c语言开发环境----make使用隐含规则只有依赖关系而没有命令的规则为隐含规则。如p1.o:p1.ca.h#orp1.o:a.hp2.o:p2.cb.h#orp2.o:b.hp3.o:p3.c#orp3.o:ornull对于隐含规则,make会自动运行相应的命令来生成目标文件。如gcc-c-op1.op1.c对于p1.o:p1.c这种自动的依赖关系,可以省略不写。只有自动依赖关系的隐含规则可以不写。第七章c语言开发环境----make伪目标规则伪目标规则完成某些编译以外的任务,例如:clear:rm*.odosth:echowhatyouwant?执行伪目标规则中的命令$makeclear$makedosth$makecleardosth第七章c语言开发环境----make如果伪目标文件存在,将不会执行预期的操作,因此,最好在make文件中声明伪目标规则.PHONY:cleardosth第七章c语言开发环境----make六、标准c函数系统调用操作系统需要向运行程序提供各种服务,如打开文件、读写文件、分配内存、获取当前时间、执行新的程序等。访问这些服务的接口叫做“系统调用(sysemcall)”,或叫做“应用程序接口(API)”、“服务原语”等。UNIX每个系统调用都在c库中设置一个具有同样名字的函数。这些函数按照系统要求的技术调用相应的内核服务。例如将若干c参数送入通用寄存器,然后执行某个软中断进入内核的机器指令。第七章c语言开发环境----标准c函数从应用的角度,系统调用可视为c函数。库函数库函数是在系统调用基础上所实现的公共函数。一个库函数可能会调用一个或多个系统调用,也可能不使用任何系统调用。例如,printf函数是库函数,它调用write系统调用;strcpy复制一个字符串,不使用系统调用。二者的关系系统调用是操作系统内核提供的,而库函数是具体编程语言提供的。库函数构建在系统调用基础之上。从编程的角度,编程者可编写其它函数来替换库函数,但无法替换系统调用。第七章c语言开发环境----标准c函数系统调用通常提供某种功能的一个最小接口,而库函数通常提供比较复杂的功能。例如,系统调用write提供基本的文件写操作,而printf则提供格式化的写操作。约定在不需要严格区分的前提下,“标准c函数”、“库函数”指所有c语言标准头文件中定义的函数,其中包括库函数和系统调用。第七章c语言开发环境----标准c函数UNIX体系结构第七章c语言开发环境----标准c函数UNIX和C语言标准化ISOCc901989年,美国国家标准学会(ANSIAmericanNationalStandardsInstitude)推出c语言标准,1990年被国际标准化组织(ISO)采纳,简称c90c991999年,ISO修改了标准,简称c99.ISOC是纯语言标准,不针对任何操作系统。ISOC定义了标准库函数,包含24个头文件。第七章c语言开发环境----标准化IEEEPOSIX1988年,为增强应用程序在各UNIX系统之间的可移植性,IEEE推出POSIX标准。POSIX:PortableOperatingSystemInterface,可移植的操作系统接口。POSIX标准不区分库函数和系统调用,一律称之为函数。POSIX标准包括ISOC所定义的标准库,另外还定义了26个必须的头文件,26个扩展头文件和8个可选的头文件。1990年该标准被ISO采纳,通常称为POSIX.1第七章c语言开发环境----标准化OpenGroupSUS19
本文标题:北航计算机学院UNIX课件7第七章 c语言开发环境
链接地址:https://www.777doc.com/doc-3165629 .html