Linux环境中的程序设计基础.ppt_第1页
Linux环境中的程序设计基础.ppt_第2页
Linux环境中的程序设计基础.ppt_第3页
Linux环境中的程序设计基础.ppt_第4页
Linux环境中的程序设计基础.ppt_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

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

文档简介

1、Linux环境中的程序设计基础,使用vi编辑文件,vi编辑器使用,vi editor是一个全屏幕文本编辑器 所有的Linux版本都提供了这一编辑器 在Linux系统中使用vi来编写文本文件 vi也是Unix世界里极为普遍的全屏幕文本编辑器,vi的启动,格式:vi options filename 功能:自动载入所要编辑的已有文件,或开启一个新文件 输出:如果未指定选项或文件,将进入vi程序并开始编辑一个新缓冲区。当屏幕的左边出现“”号,表示本行为空行。 常用选项/功能: +n从第n行开始编辑文件 +/exp从文件中匹配字符串exp的第一行开始编辑,shell程序文件的建立实例,用vi编辑器建立

2、shell程序文件shex1的步骤: 键入命令“vi shex1”,启动vi; 按命令“i”,进入vi的插入状态; 输入程序文件内容; clear cal 1 98 cal 2 98 cal 3 98 按键,再键入“:”,切换到vi的命令状态; 在“:”后键入命令“wq”,即保存文件内容后,退出vi,vi的2种状态,进入vi后有2种状态:“编辑”状态和“一般命令”状态。 编辑状态 在此状态下输入文本编辑命令,输入文本文字信息。 一般命令状态 在此状态下键入的都是命令,这些命令用来下达一些文件存档、以及离开vi等等的操作指令。 当进入vi,先在编辑状态,等待编辑命令的输入。 2种状态的转换 任何

3、情况下,按“ESC”键就进入编辑命令状态,光标定位在文档中,等待编辑命令的输入。 在编辑命令状态下,按“:”键,进入一般命令状态,屏幕左下方出现“:”提示符,等待输入一般命令。,编辑状态下的文字输入,在编辑状态下,有光标闪动,这是文字插入点。 在编辑状态下,输入以下编辑命令,便进入插入模式: a:从光标所在位置后开始追加文字,光标后的文字随追加的文字向后移动。 i:从光标所在位置前开始插入文字,光标后的文字随追加的文字向后移动。 o:在光标所在行下方新增一行,并进入编辑状态。 编辑状态下输入文字时,有2种模式:“插入”与“改写”,按“Insert”键即可转换状态。 编辑状态下按“ESC”键,就

4、退出插入模式。此时输入“/”,进入一般命令状态,然后输入欲搜索的字符再按回车键,光标将指向文本中与字符匹配的地方。,vi 下有多种编辑命令可完成以下功能: 删除与恢复 修改 剪贴板 查找与替换 光标移动 寻找、搜索 但记住编辑命令是麻烦的,实际上,在命令模式下移动方向键就可以移动光标;按Delete键与backspace键就可删除字符。,在一般命令状态下,键入以下命令: q结束编辑(打开的文档未作任何修改),退出vi q!放弃编辑不作保存(打开的文档已编辑过),退出vi wq保存当前文件后退出vi wq!强制性保存当前文件(包括只读文件)后退出vi w filename用于对新建文件(直接键入

5、vi)或当前正编辑的文件作保存后继续编辑 e 当前没有未保存的修改,则进入由指出的文件进行编辑 e! 即使有未保存的修改,也不作保存,进入由指出的文件进行编辑,退出vi,删除与恢复,在编辑状态下,对文档内容作删除操作的命令: x删除当前光标所在位置的字符,功能同“Del”键。 dw删除当前光标所在位置的单词。 dd删除当前光标所在的行,注意:dd是按两次d。 d$删除当前光标所在位置至本行结尾的所有字符。 dG删除当前光标所在位置至文件结尾处的所有字符。 恢复是指对误删除的恢复,在编辑状态下,若要恢复误删除的内容,则使用命令u。,修改,R键入R,然后键入修改后的单词。 r改写光标所在处的单个字

6、符。 用来改变光标所在处的字符的大小写。,剪切、复制、粘贴,yy将光标所处行选中,并复制到系统剪贴板上。 c即cut,是将光标所处行移到剪贴板上,原行内容在屏幕上消失。 p即paste,是将剪贴板上的内容复制到光标所在行。,查找和替换,vi中也可进行查找和替换,这无疑为修改相同的字符串带来了方便,vi的查找和替换功能是在命令方式下实现的,其命令如下: s / 需替换内容 / 修改后内容 / 需改内容所在行号 注意:在查找替换操作前,必须将光标移至文件首。,例: 用“After completion”来替换“Once I have completed it.”,shell程序运行的2种方法,运行

7、shell程序有两种方法: 在shell环境下,将shell 程序文件作为子shell程序被调用执行 $sh 例: $sh shex1,将shell程序文件视作命令来执行(因此,shell程序文件可以看作是将各种命令组合在一起而形成的新命令),此时必须赋予shell程序文件执行权限 $ 例: $ chmod a+x shex1 给程序文件赋予可执行属性 $ /home/user1/shex1 以完整的路径名键入程序名 或 $ ./shex1 以相对路径名键入程序名,带参数的运行命令,运行命令中有参数和无参数的2种情况,分别称为带参数的运行命令和不带参数的运行命令 在shell程序中一般使用的形

8、参为:$0、$1、$2、$9,共10个 当程序运行时,命令行中的、依次赋值给$1、$2、,通常称运行命令中所带的参数为实参 $0是一个特殊的形参,其值规定为当前运行的shell程序命令本身,例:建立shell程序shex3,其内容为: clear cal $1 98 cal $2 98 cal $3 98 执行时输入命令的形式为: $ sh shex3 1 2 3 第一个实参值是1,运行时代换给程序中的形参$1, 第二个实参值是2,运行时代换给程序中的形参$2, 第三个实参值是3,运行时代换给程序中的形参$3,命令shift作用,由于形参个数有限(一般为10个),当参数较多时,可通过命令shi

9、ft来移动形参与实参的对应关系 执行一次 shift 后,$1、$2、变为依次与 对应 再执行一次shift后,$1、$2、变为依次与 对应,依此类推,例:建立shell程序shex2,其内容为: echo $0 $1 $2 shift echo $0 $1 $2 运行时情况如下: # /root/shex2 yesterday today tomorrow /root/shex2 yesterday today /root/shex2 today tomorrow # 可见: $0始终是当前运行的shell程序命令本身,即/root/shex2,内部变量:由系统提供,用户不能修改。,用户变量

10、:由用户建立和修改,在 shell 脚本编写中会经常用到。是在当前shell中使用的局部变量,不能被在shell下运行的其他命令或其它shell程序使用,环境变量:这些变量决定了用户工作的环境,它们不需要用户去定义,可以直接在 shell 中使用,其中某些变量用户可以修改。它可将值传给shell运行的其他命令或shell程序使用,也就是说系统变量是全局变量,shell 变量大致可以分为三类:内部变量、用户变量和环境变量。,Shell 变量,常见的 Shell 变量,常见的 Shell 变量,PATH 变量是最重要的环境变量之一。当用户在命令行中输入命令时, shell 就会根据该变量定义的路径

11、(目录)和顺序,查找并执行该命令。如果没有正确设置 PATH 变量,则必须输入完整的路径名来运行某个命令。,用户可以根据需要修改环境变量 如:HISTSIZE,PATH,PS1,PS2 等,在 Linux 下输入命令的两种方式:,直接在命令行中输入命令:根据 PATH 查找该命令 输入完整的路径名,Shell 变量,查询当前 shell 中的环境变量:env,env,查询某个变量的值:echo,echo $变量名,Shell 变量查询,重设 PS1 和 PS2 的设置,例:export PS1=“tw$”,在 bash 中,有两个级别的命令输入提示:,export 使变量的值对当前shell及

12、其所有子进程都可见,命令提示符,一级提示符是当 bash 等待输入命令时所出现的提示符,由环境变量 PS1 控制,缺省值为 “$”; 二级提示符是在 bash 执行一个命令后,需要用户进一步输入才能完成次命令时,所出现的提示符,由环境变量 PS2 控制,缺省值为 “”。,在创建提示符时,可以使用下面的特殊字符:,命令提示符,在启动交互式会话过程中,在出现提示符前,系统会读取几个配置文件,并执行这些文件中的命令。所以这些文件可以用来定制 bash 环境。如:设置 shell 变量值或建立别名等。,bash 配置文件:,在命令行中设置和修改的变量值,只在当前的 shell 中有效。一旦用户退出 b

13、ash,所做的一切改变都会丢失。,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,在

14、这些文件中,用户可以定义自己的环境变量,而且能够覆盖在 /etc/profile 中定义的设置。,bash 启动后,将读入配置文件 /.bashrc ,并执行这个文件中的所有内容。,bash 配置文件,另外,还可以从另一个 shell 或者 bash 自身启动一个新的 bash,这种过程称为非登录交互式,启动新 bash 的命令为 bash,此时所读入的唯一 bash 配置文件是 /.bashrc,通常,个人bash 环境设置都定义在 /.bashrc 文件里,变 量,变量赋值,格式: = 功能:将等号右边的字符串赋给等号左边的变量 变量名可以由任意字符、数字或下划线组成,但数字不能作为变量名

15、的首字符。 变量名不能包含空格、惊叹号字符 变量名不能使用shell中保留的关键词等符号 变量名不能多于一个词,因为shell使用空格分析命令、定界命令名和参数,所以若字符串中含有空格,则在字符串上加上引号 例:name1=MARY name2=X Window,变 量,变量举例,例:,$ 是特殊变量,用来存储当前运行进程的PID,局部变量和作用域,引用变量,格式:$ 功能:引用变量的值。只要在变量名前加上“$”字符,变量名即将变量值取代 例: # name2=$name1 将变量name1值赋予变量name2 # echo $name1 在屏幕上显示变量name1的值,单引号和双引号允许用户

16、一次把几个字符引起来。双引号不可以把美元符$引起,因为$操作符将导出变量所代表的值。如果已包含在双引号中有$字符,并紧跟变量名,则在执行shell命令时,字符串中的变量将被变量所代表的数值所取代 例: # winner=david # notice=The person who won is $winner. # echo $notice 显示结果为:The person who won is david.,但若用户不希望求出包含在字符串中的变量的值,在这种情况下,应该使用单引号作为字符串的定界符。单引号将抑制任何变量值,并把美元符看成另一个字符 例: # winner=david # not

17、ice=The name is in the $winner variable. # echo $notice 显示结果为:The name is in the $winner variable.,若要将美元符使用,可以加上反斜杠来引导$操作符 例: # winner=david # result=$winner won $100.00 # echo $result 显示结果为: david won $100.00.,释放变量,格式:unset 功能:释放一个现存的shell变量。要慎用unset *,因为它将删除全部shell变量 例: # unset name1,变量被创建时所处的 she

18、ll 称为父 shell。如果在父 shell 中启动一个新的 shell(或进程),则该 shell ( 或进程 ) 被称为子shell ( 或子进程 )。,环境变量,环境变量就象 DNA,可以从父亲传递给儿子,再到孙子,但不能从子进程传递给父进程。,export:使变量的值对当前shell的所有子进程都可见。 说明:设置或显示环境变量。 语法:export 选项 变量名称=变量设置值 该命令的各选项含义如下: -f 代表变量名称中为函数名称; -n删除指定变量,变量实际未删除,只是不输出到后续指令的执行环境中; -p 列出所有shell赋予程序的环境变量。,环境变量举例,例:,将全局变量转

19、换成局部变量,列出所有全局变量,printf 可用来按指定的格式输出变量,printf format 输出参数列表,printf 的打印格式与 C 语言中的 printf 相同,printf %-12.5fn 123.456,format以%开头,flag,field width,precision,格式符,-:左对齐 +:输出符号 0:空白处添0 空格:前面加一空格,字段宽度,小数点后输出位数,printf 命令,printf 命令的格式说明符,format 中还可以使用,printf 命令,printf The number is: %.2fn 100,printf %-20s|%12.5

20、f|n Joy 10,printf %-10d%010o%+10 xn 20 20 20,printf %6dt%6o%6xn 20 20 20,printf 命令举例,例:,位置参量是一组特殊的内置变量,通常被 shell 脚本用来从命令行接受参数,或被函数用来保存传递给它的参数。,执行 shell 脚本时,用户可以通过命令行向脚本传递信息,跟在脚本名后面的用空格隔开的每个字符串都称为位置参量。,在脚本中使用这些参数时,需通过位置参量来引用。例如: $1 表示第一个参数,$2 表示第二个参数,以此类推。 $9 以后需要用花括号把数字括起来,如第 10 个位置参量以 $10 的方式来访问。,位

21、置参量(命令行参数),位置参量列表,Shell 脚本,Shell 脚本的编写,shell 脚本,当命令不在命令行中执行,而是从一个文件中执行时,该文件就称为 shell 脚本,即按顺序执行的Linux命令集。shell 脚本按行解释。,Shell 脚本是纯文本文件,可以使用任何文本编辑器编写 Shell 脚本通常是以 .sh 作为后缀名,Shell 脚本的执行,chmod +x script_name ./script_name,sh script_name,条件测试,条件测试可以根据某个特定条件是否满足,来选择执行相应的任务。,Bash 中允许测试两种类型的条件: 命令成功或失败,表达式为真

22、或假,任何一种测试中,都要有退出状态(返回值),退出状态为 0 表示命令成功或表达式为真,非0 则表示命令失败或表达式为假。,内置测试命令 test,通常用 test 命令来测试表达式的值,x=5; y=10 test $x -gt $y echo $?,test 命令可以用 方括号 来代替,x=5; y=10 $x -gt $y echo $?,表达式测试包括字符串测试、整数测试和文件测试。,测试表达式的值,方括号前后要留空格!,name=Tom $name = Tt? echo $?,2.x 版本以上的 Bash 中可以用双方括号来测试表达式的值,此时可以使用通配符进行模式匹配。,测试表达

23、式的值, $name = Tt? echo $?,字符串测试,name=Tom; -z $name ; echo $?,操作符两边必须留空格!,字符串测试,name2=Andy; $name = $name2 ; echo $?,整数测试,即比较大小,x=1; $x -eq 1 ; echo $?,x=a; $x -eq 1 ; echo $?,整数测试,操作符两边必须留空格!,X,整数测试也可以使用 let 命令或双圆括号,x=1; let $x = 1; echo $?,x=1; ($x+1= 2 ); echo $?,只能用于整数测试!,整数测试,相应的操作符为:,= 、!= 、 、=

24、、 、=,例:,两种测试方法的区别,使用的操作符不同 let 和 双圆括号中可以使用算术表达式,而中括号不能 let 和 双圆括号中,操作符两边可以不留空格,逻辑测试,x=1; name=Tom; $x -eq 1 a n $name ; echo $?,逻辑测试,注:不能随便添加括号, ( $x -eq 1 ) a ( n $name ) ; echo $?,X,x=1; name=Tom; $x -eq 1 echo $?,可以使用模式的逻辑测试,逻辑测试,文件测试:文件是否存在,文件属性,访问权限等。,常见的文件测试操作符,更多文件测试符参见 test 的在线帮助,man test,文件

25、测试,检查空值, $name = , ! $name , X$name != X ,检查空值,语法结构,if expr1 # 如果expr1 为真(返回值为0) then # 那么 commands1 # 执行语句块 commands1 elif expr2 # 若expr1 不真,而expr2 为真 then # 那么 commands2 # 执行语句块 commands2 . . # 可以有多个 elif 语句 else # else 最多只能有一个 commands4 # 执行语句块 commands4 fi # if 语句必须以单词 fi 终止,if 条件语句,commands 为可执

26、行语句块,如果为空,需使用 shell 提供的空命令 “ : ”,即冒号。该命令不做任何事情,只返回一个退出状态 0,if 语句可以嵌套使用,ex4if.sh,chkperm.sh,chkperm2.sh, name_grep,tellme,tellme2,idcheck.sh,几点说明,elif 可以有任意多个(0 个或多个),else 最多只能有一个(0 个或 1 个),if 语句必须以 fi 表示结束,expr 通常为条件测试表达式;也可以是多个命令,以最后一个命令的退出状态为条件值。,语法结构,case expr in # expr 为表达式,关键词 in 不要忘! pattern1)

27、 # 若 expr 与 pattern1 匹配,注意括号 commands1 # 执行语句块 commands1 ; # 跳出 case 结构 pattern2) # 若 expr 与 pattern2 匹配 commands2 # 执行语句块 commands2 ; # 跳出 case 结构 . . # 可以有任意多个模式匹配 *) # 若 expr 与上面的模式都不匹配 commands # 执行语句块 commands ; # 跳出 case 结构esac # case 语句必须以 esac 终止,case 选择语句,case 语句举例:yes_no.sh,几点说明,每个命令块的最后必须

28、有一个双分号,可以独占一行,或放在最后一个命令的后面。,所给的匹配模式 pattern 中可以含有通配符和“ | ”。,如果 expr 没有找到匹配的模式,则执行缺省值 “ *) ” 后面的命令块 ( 类似于 if 中的 else ); “ *) ” 可以不出现。,表达式 expr 按顺序匹配每个模式,一旦有一个模式匹配成功,则执行该模式后面的所有命令,然后退出 case。,语法结构,for variable in list # 每一次循环,依次把列表 list 中的一个值赋给循环变量 do # 循环开始的标志 commands # 循环变量每取一次值,循环体就执行一遍 done # 循环结束

29、的标志,几点说明,列表 list 可以是命令替换、变量名替换、字符串和文件名列表 ( 可包含通配符 ) for 循环执行的次数取决于列表 list 中单词的个数 for 循环体中一般要出现循环变量,但也可以不出现,for 循环语句,执行第一轮循环时,将 list 中的第一个词赋给循环变量,并把该词从 list 中删除,然后进入循环体,执行 do 和 done 之间的命令。下一次进入循环体时,则将第二个词赋给循环变量,并把该词从 list 中删除,再往后的循环也以此类推。当 list 中的词全部被移走后,循环就结束了。,循环执行过程,forloop.sh,mybackup.sh,位置参量的使用:

30、 $* 与 $,greet.sh,可以省略 in list ,此时使用位置参量,permx.sh tellme greet.sh / permx.sh *,for 循环执行过程,语法结构,while expr # 执行 expr do # 若 expr 的退出状态为0,进入循环,否则退出while commands # 循环体 done # 循环结束标志,返回循环顶部,执行过程,先执行 expr,如果其退出状态为 0,就执行循环体。执行到关键字 done 后,回到循环的顶部,while 命令再次检查 expr 的退出状态。以此类推,循环将一直继续下去,直到 expr 的退出状态非 0 为止。,

31、while 循环语句,shift n,用于将参量列表 list 左移指定次数,缺省为左移一次。 参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到 shift。,doit.sh a b c d e f g h,shft.sh a b c d e f g h,循环控制 shift 命令,例:,条件判断命令test,条件表达式是控制程序流程的关键,shell提供的test命令适用于条件控制流和循环控制流 格式:test 功能:返回表达式成立与否的状态值, 如果表达式成立,则test返回真的状态值0, 反之,test返回假的状态值,即一个非0值

32、。,条件控制流, if-then-else 结构 if then else fi,通常采用“ test ”,当条件成立,则返回0;条件不成立,则返回一个非0值 注意:其中if和fi必须配对出现, if-then-fi结构 if then fi,例:如果/etc目录中的文件profile存在,则将其复制到/home中,并分屏显示/home下的profile内容;否则在屯幕上显示信息“profile is not exist!” if test -e /etc/profile then cp /etc/profile /home cat /etc/profile|more else echo “p

33、rofile is not exist!” fi,建立程序文件shp3,存放在当前目录下。如果shp3运行时未带参数,则在屏幕上显示信息“Parameter is lost!” ,并结束程序运行;如果shp3运行时带一个参数,则判断参数所指定的文件是否存在,如果存在则复制该文件到/home;否则先在屏幕上显示信息“File not found!”,然后显示程序本身。,if test -z $1 -z判$1存在否 then echo Parameter is lost! 如带一参数 else if test -e $1 则$1肯定在 then cp $1 /home else echo File

34、 not found! cat $0 $0指程序本身 fi fi,例:编写shell程序shp6,存放在当前目录下。运行shp6时带一个正真数参数,将数值存入变量value; 如果该参数大于等于1但小于3,则在屏幕上显示“value is less than 3 and not less than 1”; 如果该参数大于等于3,则在屏幕上显示“value is not less than 3”; 最后以“value=xx”的形式显示变量value的值。,value=$1 if test value -ge 1 -a value -lt 3 then echo value is less tha

35、n 3 and not less than 1 fi if test value -ge 3 then echo value is not less than 3 fi echo value=$value,例:编1个shell程序shp10,当以命令“shp10 xx yy”执行时,(其中xx为年份参数,yy为季度参数),能自动清屏,并显示指定年份指定季度中的3个月的月历。,clear k=$2 if test $k -eq 1 then cal 1 $1 cal 2 $1 cal 3 $1 fi if test $k -eq 2 then cal 4 $1 cal 5 $1 cal 6 $1

36、 fi,if test $k -eq 3 then cal 7 $1 cal 8 $1 cal 9 $1 fi if test $k -eq 4 then cal 10 $1 cal 11 $1 cal 12 $1 fi, case结构 case in 字符串1) ; 字符串n) ; *) ; esac 说明:其中,字符串中可含通配符。 如果能同时匹配多个字符串,则只能执行第一个匹配字符串后的。,循环控制流, for-in结构 for in do done 其中,中的值与值之间用空格分隔。,例:用for命令实现,在当前目录下创建名为user0、user1、user9十个子目录,用长格式显示这1

37、0个目录的目录信息,然后用for命令删去这10个目录后,再用长格式显示这10个目录的目录信息。 for i in 0 1 2 3 4 5 6 7 8 9 do mkdir user$i done ls -dl user?|more for i in 0 1 2 3 4 5 6 7 8 9 do rm -rf user$i done ls -dl user?|more,例: (1)清屏 (2)当程序运行时,屏幕显示如下形式信息: * *This is a shell program * * (3)检查/home目录下,是否存在由参数1指定的文件,若不存在,则屏幕显示信息“File not fou

38、nd!”;若存在,则将参数1指定的文件改名为由参数2指定的文件名,然后用for命令对改名后的文件显示其长格式的目录信息和文件内容,clear echo “*” echo “*This is a shell program *” echo “ *”,if test -n $1 -a -n $2 then if test $1!=$2 then if test -e $1 then mv $1 $2 for cn in “ls -l” “cat” do $cn $2 echo “” done else echo File not found! fi fi fi, while 结构 while do

39、 done 说明:当返回0时,则执行一轮由do和done括起来的循环体中的,直到返回一个非0值时,则不再执行循环体中的命令,执行done后面的命令, until 结构 until do done 执行过程说明:与while 结构相反,当返回非0时,执行循环体中的命令,直到返回一个0值时,继续执行done后面的命令。,shell程序的调试,有两种简便的跟踪功能可以用于shell程序的调试 格式1:set -v 功能:当执行一个shell程序时,会在执行程序文件中的每条命令之前,自动在屏幕上先显示该条命令 格式2:set -x 功能:当执行shell程序时,它会把将要执行的命令逐条进行参量定值,并

40、以最后执行的形式在屏幕上显示,Linux环境中的程序设计基础,Linux编程环境,Linux C/C+编程,C语言是一种在Unix操作系统中被广泛使用的通用编程语言。 用C语言写的程序执行速度很快。 C语言非常适合编写系统程序,Linux内核就是使用C语言编写的。 ANSI C的C语言标准 目标是为各种操作系统上的C程序提供可移植性保证,而不仅仅限于Unix。 不仅定义了C编程语言的语法和语义,还定义了一个标准库。,标准库可以根据头文件划分为15个部分,其中包括字符类型、错误码、浮点常数、数学常数、标准定义、标准I/O、工具函数、字符串操作、时间和日期、可变参数表、信号、非局部跳转、本地信息及

41、程序断言等。,C语言开发环境简介,Linux上广泛使用的C语言编译器是GNU C编译器,GNU C建立在自由软件基金会的编程许可证的基础上,可以自由发布。在Linux下,一个完整的C语言开发环境到少包括以下三个组成部分: 函数库glibc 编译器gcc 系统头文件glibc_header glibc是构成一个完整的C语言开发环境所必不可少的组成部分,也是Linux下C语言的主要函数库。 glibc_header中包含了系统编译源代码所需要的声明文件,如果缺少系统头文件,很多用到系统功能的C程序将无法编译。,glibc有两种安装方式: 安装成测试用的函数库 在编译程序时用不同的选项来试用新的函数

42、库。 安装成主要的C语言函数库 所有新编译程序均使用的函数库。 gcc是可以在多种硬件平台上编译出可执行程序的超级编译器,gcc编译器能将C语言、C+语言源程序、汇编语言程序和目标程序编译、连接成可执行文件。 在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类型。,gcc支持编译的一些源文件的后缀及其说明:,在Linux中,gcc(GNU C Compiler)是C、C+、Objective-C源程序的编译器,gcc编译C源程序并生成可执行文件要经过以下四步: (1)预处理 gcc编译器调用cpp程序,对各种命令如

43、 #define、#include进行分析。 (2)编译 gcc编译器调用ccl 程序,根据输入文件产生中间文件。 (3)汇编 gcc编译器调用as程序,用中间文件作为输入产生以.o作为类型名的目标文件。 (4)连接 gcc编译器调用 ld程序,将各目标程序组合于可执行文件中的适当位置,这一程序引用的函数也放在可执行文件中。,C函数库,定义:是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常是一组相互关联的用来完成某项常见工作的函数构成(比如c库里面的标准输入输出函数、时间函数和数学函数等)。 函数库中的函数可以通过连接程序与应用程序进行连接,而不必在每次开发程序时都

44、对这些通用的函数进行编译。 不同类型的应用程序将会使用不同的函数库。如数学应用将使用数学库libm,X-Window应用程序将使用Xlib库及libX11。,所有的程序都将使用标准的C函数库-libc,该库中包含了内存管理或输入输出操作的基本函数,这些库都存放在/usr/lib这些系统公用的目录中,系统中的任何用户都可以利用这些库。 库可以有三种使用的形式: 静态库:代码在编译时就已连接到开发人员开发的应用程序中。 共享库:只是在程序开始运行时才载入,在编译时,只是简单地指定需要使用的库函数。 动态库:是共享库的另一种变化形式,也是在程序运行时载入,使用的库函数不是在程序运行开始,而是在程序中

45、的语句需要使用该函数时才载入。,动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其他程序使用。 由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。 已经开始的大多数库都采用共享库的方式。ELF格式的可执行文件使得共享库能够比较容易地实现,当然使用旧的a.out模式也可以实现库的共享。Linux系统中目前可执行文件的标准格式为ELF格式。,系统中可用的库都存放在/usr/lib和/lib目录中。库文件名由前缀lib和库名以及后缀组成。根据库的类型不同,后缀名也不一样。共享库的后缀名由.so和版本号组成,静态库名的后缀名为.a或.sa(采用

46、旧的a.out格式的共享库)。 共享库名的格式:库的名称.so.主版本号.次版本号 静态库名的格式:库的名称.a 例如: libm.so.5数学共享库的标识字符为m,版本号为5 libm.a静态数字库,库文件与头文件的位置,函数库存放的标准目录: /lib系统必备共享库 /usr/lib标准共享库和静态库 /usr/i486-linux-libc5/liblibc5兼容性函数库 /usr/X11R6/libX11R6的函数库 /usr/local/lib本地函数库 头文件存放的目录: /usr/include系统头文件 /usr/local/include本地头文件 共享库及相关配置文件在/e

47、tc目录中,其中: ld.so.conf包含共享库的搜索位置 ldconfig共享库管理工具,一般在更新了共享库之后要运行该命令 ldd可查看可执行文件所使用的共享库,gcc的基本用法和选项,格式:gcc options filename 常用选项的说明: -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。 -c对源程序进行预处理、编译,产生目标文件,但不进行连接成为可执行文件。 -DMACRO 以字符串“1”定义 MACRO 宏。 -DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 -E在预处理

48、后停止,输出预处理后的源代码至标准输出,不进行编译。,-g产生一张用于调试和排错的扩展符号表,此选项使程序可用gdb进行调试。 -o 定义输出的执行文件名为 -S在编译后停止,产生类型名为s的汇编代码文件,不生成中间文件。 -O对程序编译进行优化,减少被编译程序的长度和执行时间,但此时的编译速度比不作优化慢且要求较多的内存。 -lobjc可用于连接类型名为o的目标文件生成可执行文件。 -w 不生成任何警告信息 -Wall生成所有警告信息。,/*程序清单main.c*/ #include #include int factorial (int n); int main (int argc, ch

49、ar *argv) int n; if (argc 2) printf (Usage: %s nn, argv 0); return -1; else n = atoi (argv1); printf (Factorial of %d is %d.n, n, factorial (n); return 0; ,假设有 两个源文件 main.c 和 factorial.c ,现在要编译生成一个计算阶乘的程序。,/*程序清单factorial.c*/ #include #include int factorial (int n) if (n = 1) return 1; else return f

50、actorial (n - 1) * n; ,$ gcc -o factorial main.c factorial.c $ ./factorial 5 Factorial of 5 is 120.,GCC 可同时用来编译 C 程序和 C+ 程序。一般来说,C 编译器通过源文件的后缀名来判断是 C 程序还是 C+ + 程序。 在 Linux 中,C 源文件的后缀名为 .c,而 C+ 源文件的后缀名为 .C 或 .cpp。 但是,gcc 命令只能编译 C+ 源文件,而不能自动和 C+ 程序使用的库连接。因此,通常使用 g+ 命令来完成 C+ 程序的编译和连接,该程序会自动调用 gcc 实现编译。 假设我们有一个如下的 C+ 源文件(hello.

温馨提示

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

评论

0/150

提交评论