Transcript 2 Linux编程工具
操作系统接口编程——GNU/Linux编程
第1讲 Linux编程工具包
主讲: 贺金平
TM 版权所有
西南林学院计算机系 贺金平
1
本讲内容目录
1 Linux历史与版本
2 Linux操作系统安装
3 Linux常用命令
4 vi 编辑器
5 使用GNU CC(gcc)
6 Make管理项目
7 autotools
8 RCS与CVS版式本控制
9 GDB调试
10 出错处理
11使用库
西南林学院计算机系 贺金平
TM
2
2
1.1 Linux历史与版本
Linux是一种类Unix操作系统,是一个完全免费的操作系统
Linux最早是Linus Torvalds (李纳斯·托沃兹 )于1991年在
芬兰赫尔辛基大学原创开发的,并在GNU的GPL(General
Public License)原则下发行。
GNU:为推广自由软件的精神而实现一个自由的操作系统,然
后从应用程序开始,实现其内核.linux优良的内核性能使
GNU采用了linux内核并进行开发。
GPL:通用公共协议,是一个开放而又严格的许可协议,它规定
了源码必须可以无偿的获得且可修改.
Linux又称为GNU/linux,其中许多重要的工具如gcc、gdb
、make、emacs等都是GNU贡献的
西南林学院计算机系 贺金平
TM
3
3
1.2 linux的发行版本
Linux内核版本有两种:稳定版和开发版。
Linux内核的命名机制:内核版本由3部分数字构成的(主
版本号.次版本号. 修订版本号,例如:2 . 4 . 18 )
如果次版本号是偶数,那么该内核就是稳定版;若是奇数
,则是开发版。
*查看内核版本命令:cat /proc/version 或 cat /etc/issue
或 uname -a
到目前为止,linux发行版本已超过250多种,内核也从原
来的0.01发展到现在的2.6.x.x
西南林学院计算机系 贺金平
TM
4
4
国内外主要发行版本
国外:
1.Red Hat Linux (fedora
Linux)
国内:
1.红旗 Linux
2.SuSE Linux
2.中标普华 Linux
3.Debian Linux (Ubuntu
Linux)
3.共创 Linux
4.Mandrake Linux
4.冲浪 Linux
5. 蓝点 Linux
5. Gentoo Linux
西南林学院计算机系 贺金平
TM
5
5
2 Linux操作系统安装
2.1 Linux系统安装
2.2 WMware虚拟机安装
2.3 虚拟机工具(wmtools)安装
2.4 设定共享目录
西南林学院计算机系 贺金平
TM
6
6
2.1 Linux系统安装
安装光盘:red hat linux安装光盘有三张,可在网上下载
ISO文件
分区:red hat linux安装至少要三个分区:启动分区
(/boot)、交换分区(swap)、根分区(/)
SWAP分区:linux在硬盘上划出一个区域来当作临时内存
,相当于windows系统中的虚拟内存,一般将其设为内存
大的2倍
Grub:linux系统的引导装载器。
Root权限:linux是一个多用户操作系统。Root是超级用户
安装硬件要求:硬盘空间建议大于3G,内存建议大于256M
西南林学院计算机系 贺金平
TM
7
7
Linux安装步骤及注意事项
安装步骤:详见安装图解
注意事项:
作为嵌入式系统开发,建议在VMware Workstation软件中安
装虚拟机,硬盘空间建议6G~12G
分区时选择手动分区
安装过程中,切记root用户的密码
西南林学院计算机系 贺金平
TM
8
8
2.3 虚拟机及工具(wmtools)安装
安装VMware
Workstation 5.0.0 build13124虚拟机
安装WMware Tools
西南林学院计算机系 贺金平
TM
9
9
安装WMware Tools
如果不安装此工具包,鼠标进入到虚拟机后,要按下
CTRL+ALT组合键 才能将鼠标退出到windows系统,操作
起来比较麻烦。
安装方法如下:
西南林学院计算机系 贺金平
TM
10
10
安装方法如下
#tar zxf vmware-linux-tools.tar.gz
#cd vmware-linux-tools
//注:此工具包在安装光盘中就有
//进入解压后的目录
#./vmware-install.pl (运行安装脚本)
这时install提示你是否需要备份以前的配置文件,建议选择"y"
vmware安装完成之后:
#service vmware-tools start
//启动vmware-tools服务
运行vmware-config.pl的时候,会有一步是询问内核的头文件在哪里,
解决方法从安装光盘中copy kernel-xen-devel-2.6.18-8.el5.i686.rpm
# rpm -ivh kernel-xen-devel-2.6.18-8.el5.i686.rpm
重新执行vmware-config.pl,可以解决这个问题。
西南林学院计算机系 贺金平
TM
11
11
2.4 设定共享目录
西南林学院计算机系 贺金平
TM
12
12
西南林学院计算机系 贺金平
TM
13
13
查看共享目录
共享设置完毕后,linux系统中会有
# /mnt/hgfs/hjp/
此目录,把windows中的文件拷贝到E:\vmshare目录,再
去虚拟机的/mnt/hgfs/hjp看看文件是否在那里了,如果操
作无误,则共享目录设置成功。
西南林学院计算机系 贺金平
TM
14
14
3 Linux常用命令
//进入上一级目录
#cd ..
#ls -l
#mkdir filepath
//建立目录
#rm –rf filepath
//删除目录
#touch helloworld.c
#cp helloworld.c /root/hello.c
#cp –a filepath /root
#mv helloworld.c /root/hello.c
# rm –f helloworld.c
ls -a
西南林学院计算机系 贺金平
//显示文件-l详细,-a显示隐藏
vi helloworld.c //建立新文件
//拷贝文件并改名
//拷贝目录(带链接)
//移动文件并改名
//删除文件
TM
15
15
Linux常用命令(续)
#find . –name hello.c
//在当前目录及子目录查找文件
#grep –R “printf” .
//查看当前目录中包含printf的文件
#file helloworld.c
#uname –r
//显示当前内核版本
#who
//显示当前登录用户
#tar zxvf filepath.tar.gz
#tar zcvf filepath.tar.gz filepath
#tar jxvf filepath.tar.bz2
#tar jcvf filepath.tar.bz2 filepath
西南林学院计算机系 贺金平
//显示文件属性
//解压.tar.gz文件
//压缩.tar.gz
//解压.tar.bz2文件
TM
//压缩.tar.bz2
16
16
Linux常用命令(续)
//显示文件内容
#cat hello.c
#chmod 755 hello //为hello文件设置权限
#pwd
#mount
#unmount
#export
//声明环境变量
#exit
//关闭当前终端
#man find
#help
西南林学院计算机系 贺金平
//查看当前目录的绝对路径
//挂载设备到目录
//卸载
TM
17
17
Linux常用命令(续)
#insmod //加载模块
#lsmod
//查看已加载模块
#rmmod
//卸载模块
#ps –e
//查看当前所有运行的进程
#kill
//结束某进行
#reboot
//重启系统
#halt
//关机
#ifconfig //查看(配置)IP地址
#ping
西南林学院计算机系 贺金平
TM
18
18
4 vi编辑器
Vi是一个高级文本编辑器。它可以执行输出、删除、查找、
替换等众多文本操作而且用户可以根据自己的需要对其进
行定制,这是其他编辑程序所没有的。
Vi有三种基本工作模式:命令行模式,文本输入模式,末行
模式。
西南林学院计算机系 贺金平
TM
19
19
Vi三种工作模式
命令行模式:不管处于何种模式,只要按一下ESC键即可
使vim进入命令行模式;此时从键盘上输入的任何字符都被
当作编辑命令来解释。
文本输入模式:在命令模式下输入插入命令i等都可以进入
文本输入模式;在该模式下输入的任何字符都被当做文件
内容保存起来。
末行模式:在命令模式下按“: 键”即可进入末行模式;此
时会在显示窗口的末行显示一个冒号作为末行模式的提示
符,等待用户输入命令。
西南林学院计算机系 贺金平
TM
20
20
vi的进入与退出
进入vi:在shell模式下键入vi及需要编辑的文件名即可。例
如:vi example.txt
退出vi:首先按ESC键进入命令模式,然后输入:进入末行
模式,末行模式下输入q直接退出;wq(或x)保存后退出
;q!不保存强制退出。
西南林学院计算机系 贺金平
TM
21
21
光标移动操作
vi 中的光标移动既可以在命令模式,下也可以在文本输入
模式下。
在文本输入模式下可直接使用键盘上的四个方向键移动光
标。
在命令模式下除了使用四个方向键还可以用h(左)、l(右
)、j(上)、k(下)这四个键来移动光标。(熟练后可以
达到手不离键,从而提高工作效率)
快速移动命令:0(零)光标移到行首;$光标移到行尾;
nG光标移到第n行;H光标移到屏幕上显示的第一行;L光
标移到屏幕上显示的最后一行;M光标移到屏幕的中间一行
。
西南林学院计算机系 贺金平
TM
22
22
文本插入操作
1. 插入命令:i命令,插入文本从光标所在位置前开始,屏
幕末行显示“--INSERT --”提示字样。I 移到该行行首,在
其前插入文本。
2. 附加命令:a命令,该命令用于在光标当前所在位置之后
追加新文本,新输入的文本被放在光标之后。A 移到行尾,
在其后插入文本。
3. 添行命令:o命令,该命令将在光标所在行的下面新开一
行,并将光标置于该行的行首,等待输入文本;O 是在光
标所在行的上面插入一行。
西南林学院计算机系 贺金平
TM
23
23
文本修改操作
1. 文本删除/移动;
删除单个字符:x删除光标处的字符;nx删除从光标所在位
置开始向右的n个字符;X删除光标前面的那个字符; nX删
除从光标前面开始向左的n个字符。
删除多个字符:dd删除光标所在的整行;dw删除一个单词
;d0删除从光标前一个字符开始到行首的内容;d$(或D)删
除从光标所在处开始到行尾的内容。
2. 文本复制命令;yy复制光标所在的整行,可以使用p命令
粘贴。(dd类似与剪切)
3. 撤销与重做命令:u支持多次撤销,U单次撤销。在命令
模式下按“.”(点号)键既可重做。
西南林学院计算机系 贺金平
TM
24
24
文本搜索与替换
1. 模式搜索命令:
“/”命令,从光标位置向文件尾部搜索键入的模式,搜索下一
个匹配使用n,搜索上一个匹配使用N;
“?”命令,从光标位置向文件头部搜索。
2. 文本替换命令:(必须在末行模式下操作)
:s/text1/text2 将光标所在段落搜索到的第一个text1替换为
text2;
:s/text1/text2/g 将光标所在段落的所有text1替换为text2;
:1,$s/text1/text2/g 替换所有符合条件的字符( 1,$ 表示搜索
范围是从首行到末行)
西南林学院计算机系 贺金平
TM
25
25
5 使用GNU CC(gcc)编译器
GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编
译系统,能编译C、C++等语言编写的程序。
西南林学院计算机系 贺金平
TM
26
26
GCC编译流程解析
GCC编译流程分为4个步骤:
(1)预处理(pre-processing)
(2)编译(compiling)
(3)汇编(assembling)
(4)链接(linking)
GCC指令的一般格式:
Gcc [选项] 源文件 [选项] 目标文件
其中,目标文件可缺省,Gcc默认生成可执行的文件,名为”编译文件
.out”
西南林学院计算机系 贺金平
TM
27
27
GCC例子
Helloworld.c程序(vi编译器编辑程序):
#include <stdio.h>
Int main(){
printf(“hello,this is our embedded world!\n”);
return 0;
}
编译: gcc helloworld.c –o helloworld.o
运行: ./helloworld.o
西南林学院计算机系 贺金平
TM
28
28
GCC编译选项分析(1)
西南林学院计算机系 贺金平
TM
29
29
GCC编译选项分析(2)
西南林学院计算机系 贺金平
TM
30
30
GCC编译选项分析(3)
西南林学院计算机系 贺金平
TM
31
31
6 Make管理项目
6.1 Make工程管理器
6.2 Makefile文件格式及规则
西南林学院计算机系 贺金平
TM
32
32
6.1Make工程管理器
Make工程管理器:顾名思义,是指管理较多的文件的。如
果一个应用要涉及很多个程序文件,手工用GCC一个个去
编译将是一件很麻烦的事情;另外,编译一次后,根据需
要如果只部分程序做了改动,则应只需重新编译改过后的
文件,人们希望有一个工程管理器能自动识别更新了的文
件代码,同时又不需要重复输入冗长的命令长,于是,
make工程管理器就应运而生了。
西南林学院计算机系 贺金平
TM
33
33
6.2 Makefile文件格式及规则
Makefile是make读入的惟一的配置文件,本节要讲的实际上就是
makefile文件的编写规则。
一个Makefile中通常包含如下内容:
需要由make工具创建的目标体(target),通常是目标文件或可执行文件
要创建的目标体所依赖的文件(dependency_file)
创建每个目标体时需要运行的命令(command)
Makefile是格式为:
target : dependency_file
command
注意: (1)每个command前必须有Tab符
(2)Makefile中使用”#” 注释程序
西南林学院计算机系 贺金平
TM
34
34
一个简单的例子
#the simplest example
Hello.o:hello.c hello.h
gcc –c hello.c -o hello.o
注意:gcc前是一个tab符
西南林学院计算机系 贺金平
TM
35
35
Makefile中使用变量
为了简化编辑和维护Makefile,允许在Makefile中创建和使
用变量,变量是在Makefile中定义的名字,用来代替一个文
本字符串,该文本字符串称为该变量的值。在具体要求下
,这些值可以代替目标体、依赖文件、命令以及Makefile文
件中的其他部分。
Makefile中的变量有两种方式:递归展开方式和简单方式。
递归展开方式是指定义的变量又在引用其他的变量,在使
用该变量时一次性将内嵌的变量全部展开,这种方式的缺
点是有时会导致变量的循环引用。简单展开方式定义的变
量在定义处展开,并且只展开一次,因此它不含任何其他
变量的引用。
西南林学院计算机系 贺金平
TM
36
36
关于变量名
递归展开方式为: VAR=var
简单展开方式为: VAR:=var
Make中引用变量均使用格式:
变量名是不包括”:”、”#”、“=”结尾空格的任何字符。同
时变量名中包含字母、数字和下划线以外的情况尽量避免
,因为它们可能存在特定的含义
变量名是区分大小写的。即foo和Foo代表不同的变量。
西南林学院计算机系 贺金平
$(VAR)
TM
37
37
例子:Makefile中使用变量
OBJS=he.o jin.o ping.o
CC=gcc
CFLAGS=-Wall –o –g
Hjp:$(OBJS)
$(CC) $(OBJS) -o hjp
He.o: he.c he.h
$(CC) $(CFLAGS) –c he.c –o he.o
Jin.o:jin.c jin.h
$(CC) $(CFLAGS) –c jin.c –o jin.o
Ping.o : ping.c ping.h
$(CC) $(CFLAGS) –c ping.c –o ping.o
西南林学院计算机系 贺金平
TM
38
38
Makefile变量的分类
Makefile中的变量分为用户自定义变量、预定义变量、自动变量及
环境变量。
上例中OBJS就是用户自定义变量,由用户自行设定,而预定义变
量和自动变量为通常在Makefile中都会出现的变量,其中部分有默
认值,当然用户也可以对其进行修改。
自动变量:由于常见的GCC编译语句中通常包含了目标文件和依
赖文件,为了简化Makefile的编写,就引入了自动变量。自动变量
通常可以代表编译语句中出现的目标文件和依赖文件,并且具有本
地含义(即下一语句出现的相同变量代表的是下一句的目标文件和
依赖文件)
环境变量:系统自动读取当前系统环境变量。如果用户自定义变量
与之重名,则用户自定义变量将覆盖同名的环境变量.
西南林学院计算机系 贺金平
TM
39
39
Makefile中常见的预定义变量
西南林学院计算机系 贺金平
TM
40
40
Makefile中常见的自动变量
西南林学院计算机系 贺金平
TM
41
41
例子:自动变量使用
OBJS=he.o jin.o ping.o
CC=gcc
CFLAGS=-Wall –o –g
Hjp:$(OBJS)
$(CC) $(OBJS) -o hjp
He.o: he.c he.h
$(CC) $(CFLAGS) –c $^ –o $@
Jin.o:jin.c jin.h
$(CC) $(CFLAGS) –c $< –o $@
Ping.o : ping.c ping.h
$(CC) $(CFLAGS) –c $< –o $@
西南林学院计算机系 贺金平
TM
42
42
Makefile规则
Makefile规则是make进行处理的依据,它包括了目标体、
依赖文件及其之间的命令语句。一般来说,Makefile中的一
条语句就是一个规则。如上例中都显示地指出了Makefile中
的规则关系,如“$(CC) $(CFLAGS) –c $^ –o $@“,为了
简化Makefile的编写,make还定义了隐式规则和模式规则
。
西南林学院计算机系 贺金平
TM
43
43
(1)隐式规则
隐式规则能告诉make怎样使用传统的技术完成任务,当用
户使用它们时不必详细指定编译的具体细节,而只需把目
标文件列出即可。Make会自动搜索隐式规则目录来确定如
何生成目标文件。
上例可写成:
OBJS=he.o jin.o ping.o
CC=gcc
CFLAGS=-Wall –o –g
Hjp:$(OBJS)
$(CC) $^ -o $@
西南林学院计算机系 贺金平
TM
44
44
为什么可以省略后面几句?
因为make的隐式规则指出:所有的”.o”文件都可自动由
”.c”文件生成,使用命令:
$(CC) $(CPPFLAGS) $(CFLAGS) –c file.c –o file.o
这样he.o、jin.o、ping.o就会分别调用如下生成:
$(CC) $(CFLAGS) –c he.c –o he.o
$(CC) $(CFLAGS) –c jin.c –o jin.o
$(CC) $(CFLAGS) –c ping.c –o ping.o
隐式规则只能查找到相同文件名的不同后缀名文件,如he.o文件必须
由he.c文件生成
西南林学院计算机系 贺金平
TM
45
45
Makefile中常见的隐式规则目录
西南林学院计算机系 贺金平
TM
46
46
(2)模式规则
模式规则是用来定义相同处理规则的多个文件的。它不同于隐式规则,隐式
规则仅仅能够用make默认的变量来进行操作,而模式规则还能引入用户自定
义变量,为多个文件建立相同的规则,从而简化Makefile的编写。
这个规则的相关文件前必须用”%”标明。
使用模式规则修改上例为如下:
OBJS=he.o jin.o ping.o
CC=gcc
CFLAGS=-Wall –o –g
Hjp:$(OBJS)
$(CC) $^ -o $@
%.o : %.c
$(CC) $(CFLAGS) –c $< -o $@
西南林学院计算机系 贺金平
TM
47
47
Make管理器的使用
Make使用时其后输入目标名即可建立指定的目标,如果直
接运行make,建立Makefile中的第一个目标。Make命令有
丰富的选项以完成不同的功能。
西南林学院计算机系 贺金平
TM
48
48
例子
/*main.c*/
#include "mytool1.h"
#include "mytool2.h"
int main(){
mytool1_print("hello");
mytool2_print("hello");
}
西南林学院计算机系 贺金平
TM
49
49
/*mytool1.h*/
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/*mytool2.h*/
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void myrootl2_print(char *print_str);
#endif
西南林学院计算机系 贺金平
TM
50
50
/*mytool1.c*/
#include "mytool1.h"
void mytool1_print(char *print_str){
printf("This is mytool1 print %s\n",print_str);
}
/*mytool2.c*/
#include "mytool2.h"
void mytool2_print(char *print_str){
printf("This is mytool2 print %s\n",print_str);
}
西南林学院计算机系 贺金平
TM
51
51
编写Makefile文件
#this is Makefile
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o :mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
clean:
rm -f *.o main
西南林学院计算机系 贺金平
TM
52
52
简化后的Makefile文件
#this is Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc –c $<
mytool1.o :mytool1.c mytool1.h
gcc –c $<
mytool2.o:mytool2.c mytool2.h
gcc –c $<
clean:
rm -f *.o main
西南林学院计算机系 贺金平
TM
53
53
再次简化后的Makefile文件
#this is Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
%.o:%.c %.h
gcc –c $<
clean:
rm -f *.o main
西南林学院计算机系 贺金平
TM
54
54
7 autotools使用
上一节中,我们了解到Makefile可以帮助make完成它的使
命,但要承认的一点是,编写Makefile确实不是一件容易的
事,特别是较大的项目更是如此。那么有没有一种轻松的
手段生成Makefile而同时又能让用户享受make的优越性呢
?
本节讲到的autotools系列工具正是为此而设计的,它只需
用户输入简单的目标文件、依赖文件、文件目录等就可以
轻松地生成Makefile了,这无疑是广大用户所希望的。
西南林学院计算机系 贺金平
TM
55
55
Autotools系列工具
首先要确认系统是否安装了以下工具(可用which命令查看
)
Autoscan
Aclocal
Autoconf
Autoheader
Automake
具体使用方法见:autotools使用.doc
西南林学院计算机系 贺金平
TM
56
56
8 RCS与CVS版本控制
版本控制是指跟踪和管理源代码文件变化的自动过程。
主要应用在多人协作完成一个项目时,实现程序的集中化
管理。便于项目的整体控制、单元调试和整体调试。
8.1 RCS版本控制
8.2 CVS版本控制
西南林学院计算机系 贺金平
TM
57
57
8.1 RCS版本控制
RCS版本控制主要涉及两个命令:ci 和 co
概念理解
检入: 把修改后的程序上传到服务器
检出:把服务器上的程序下载到客户端
西南林学院计算机系 贺金平
TM
58
58
RCS版本控制例子
例:A用户和B用户都在操作包含yo.c文件的一个项目;
A操作:
# ci -i yo.c //(初次)检入文件 得到ci.c,v工作文件 V1.1
#co –l yo.c //检出文件
修改文件yo.c,保存退出
#ci yo.c
//检入后得到yo.c的第二个版本V1.2: ci.c,v
B操作:
#co –l yo.c
修改文件yo.c,保存退出
#ci yo.c
//检入后得到yo.c的第三个版本V1.3: ci.c,v
西南林学院计算机系 贺金平
TM
59
59
RCS版本控制:注意事项
注意事项
1 不要删除yo.c,v工作文件;
2 检出时须加上-l参数,否则修改的将会是只读文件,而且
修改完以后不能检入;
3 如果检出时忘记加-l参数了,可直接将yo.c删除,重新带
参数检出;
4 如果对方正检出并打开文件在修改,自已不能再次检出,
只能以只读方式打开。如果操作不慎,可能会产生交换文
件(.swp),注意交换文件是隐藏文件,通过ls –a查看,最
好将其删除。
西南林学院计算机系 贺金平
TM
60
60
8.2 CVS版本控制
CVS是建立在RCS基础之上的,是对RCS的功能扩展。
CVS优点:
1 比RCS更适合于管理多目录的项目
2 能处理分布式项目。分别处理地理位置不同的多名开发人
员在访问和操作同一个代码库。
而RCS通过其加加锁机制,一个时刻只能允许一个人编辑
某个文件,CVS却没有这样的限制。
注意:CVS版本控制不能以root用户进行操作,否则不能检入
(即cvs commit file会失败)
西南林学院计算机系 贺金平
TM
61
61
(CVS)具体方法如下:
创建源代码库,用cvs init初始化该库。
#cvs –d $HOME/cvs init
设置环境变量
#export CVSROOT=$HOME/cvs
源码导入cvs
#cd c08
#cvs import –m “ok” c08 lpu2 start
西南林学院计算机系 贺金平
TM
62
62
(CVS)具体方法(续)
#ls $CVSROOT/c08 –l
#cd ..
#mv c08 c09
#cvs checkout c08
#rm –rf c09
修改c08中的文件,完毕后保存,退出。
#cvs update //查看更新的文件
M yo.c
//见如下提示,说明yo.c有改动
#cvs commit yo.c
西南林学院计算机系 贺金平
//检出
//检入
TM
63
63
9 GDB调试
GDB功能:对程序进行跟踪调试。
1 能判断是程序出错的行数
2 能设置断点(增加和删除断点、按行或按函数名设置断点
、按条件设置断点)
3 能单步调试程序(即单步运行)
4 能实时打印变量的值
5 能显示变量的数据类型,函数的返回值类型
6 程序运行中能设置变量的值
西南林学院计算机系 贺金平
TM
64
64
示例:
以debugme.c程序为例
编译程序: #gcc debugme.c –o debugme -g
注意:加上-g参数是为了在debugme目标文件中加入调试
信息,以便于GDB调试
开始GDB调试
# gdb debugme
结束GDB调试
(gdb)quit
西南林学院计算机系 贺金平
TM
65
65
具体方法
1 判断是程序出错的行数:如果程序中有段错误,则程序会
自动显示出错误的行数。
2 设置断点
按行添加断点 (gdb) break 24
//在程序24行中添加断点
按函数名添加断点 (gdb) break func //func函数处设断点
按条件设置断点 (gdb) break 24 if i==15 //24行代码中如果
i=15,则程序停在此断点处
查点断点信息 (gdb) info break
删除断点
西南林学院计算机系 贺金平
//每个断点都会有个编号
//n为第几个断点
(gdb) delete n
TM
66
66
具体方法(续)
3 单步调试程序(即单步运行) (gdb) step
4 能实时打印变量的值
(gdb) print i
//显示变量i的值
(gdb) print ary[0]@10
//显示ary[0]至ary[10]的值
5 能显示变量的数据类型,函数的返回值类型
(gdb)whatis i
//显示变量i的数据类型
(gdb)whatis ary //显示数组ary的数据类型
(gdb)whatis func //显示函数func的返回类型
6 程序运行中能设置变量的值
(gdb) set variable i=10
西南林学院计算机系 贺金平
TM
67
67
10 出错处理
程序中对库函数以及用户函数的调用设置错误检测,确保
函数调用返回值错误导致程序异常中止时能向用户报告出
错信息。
本节将简要介绍一下出错处理函数。
西南林学院计算机系 贺金平
TM
68
68
10.1 assert宏
#include <assert.h>
Void assert(int expression);
作用:先计算表达式expression,如果其值为假(0),那么它
首先向stderr打印一条出错信息,然后通过abort函数来终
止程序运行。
示例见教材P123 例9.1
西南林学院计算机系 贺金平
TM
69
69
__LINE__和__FILE__宏
作用:提示用户程序出错的行。
详见教材P125 例9.2,9.3,9.4
西南林学院计算机系 贺金平
TM
70
70
标准库函数
#stdlib.h
void abort(void);
#stdlib.h
void exit(int status);
#stdlib.h
int atexit(void (*fcn)(void));
#stdio.h
void perror(const char *s);
#string.h
char *strerror(int errnum);
#errno.h
int errno;
这些函数的作用基本上都是提示出错信息的。具体用法就
不讲了,自已去看书上的例子,或要用到的时候再去网上
查个示例程序就知道了。这里主要看看errno的常见值及其
含义。
西南林学院计算机系 贺金平
TM
71
71
Error常见值(教材P129 表9.1)
EPERM
1
操作不被允许
ENOENT
2
文件或目录不存在
ESRCH
3
进程不存在
EINTR
4
系统调用中断
EIO
5
I/O错误
ENXIO
6
设备或地址不存在
E2BIG
7
参数太长
EBADF
9
错误的文件号
ECHILD
10
子进程不存在
EAGAIN
11
重试
ENOMEM
12
没有内存
EACCES
13
没有权限
EFAULT
14
西南林学院计算机系 贺金平
地址错误
TM
72
72
Error常见值(续)
EBUSY
16
设备或资源忙
EEXIST
17
文件存在
ENODEV
19
设备不存在
ENOTDIR
20
不是目录
EISDIR
21
目录
EINVAL
22
无效参数
EMFILE
24
打开的文件太多
ENOTTY
25
不是打印机
EFBIG
27
文件太大
ENOSPC
28
磁盘上没有空间
EPIPE
32
管道中断
EDOM
33
数学参数超出函数定义域
ERANNGE
34
数学结果不可表示
EILSEQ
84
非法字节序列
ERESTART 85
中断的系统调用应该重启
EUSERS
用户数太多
87
西南林学院计算机系 贺金平
TM
73
73
11使用库
编程库有两个主要优点:它们能够实现代码重用。
本节将介绍以下内容:
11.1 命名和编号约定
11.2 库操作工具
11.3 环境变量和配置文件
11.4 编写并使用静态库
11.5 编写并使用共享库
西南林学院计算机系 贺金平
TM
74
74
11.1 命名和编号约定
约定1:库名都以lib开头
约定2:静态库以.a结尾;共享库以.so结尾
约定3:版本约定。
示例libgdbm.so.2.1.0
库名:libgdbm.so
主版本号:2
次版本号:1
补丁号:
0 (又名:发行号)
西南林学院计算机系 贺金平
TM
75
75
约定3 补充说明
当库的变化达到了和以前的版本不能兼容时,要增加主版
本号;
当库有了新变化,但能和以前的版本兼容时,要增加次版
本号;
修正库中错误而进行的改动时,改变补丁号;
西南林学院计算机系 贺金平
TM
76
76
11.2 库操作工具
1 nm命令
功能:例出编入目标文件或二进制文件的所有符号。可查
看程序调用了什么函数;也可查看一个给定的库或目标文
件是否提供了所需的函数。
用法: nm fileName
2 ar命令
功能:创建静态库
用法: ar rcs
西南林学院计算机系 贺金平
liberr.a liberr.o
TM
77
77
库操作工具(续)
3 ldd命令
功能:例出程序正常运行所依赖(需要)的共享库
用法: ldd fileName
4 ldconfig命令
功能:创建和维护对最新版本共享库的链接
用法: ldconfig libs
西南林学院计算机系 贺金平
TM
78
78
11.3 环境变量和配置文件
动态链接器/加载器ld.so使用两个环境变量。
LD_LIBRARY_PATH
//一般都使用该变量
以冒号分隔的目录清单,在这些目录下可搜索运行时的共
享库
对应配置文件: /etc/ld.so.conf
LD_PRELOAD
以空格分隔的目录清单,它需要在其他所有库加载之前加
载
对应配置文件: /etc/ld.so.preload
西南林学院计算机系 贺金平
TM
79
79
11.4 编写并使用静态库
目的:编译一个静态库,并用测试程序测试该静态库
具体步骤如下:
1 编辑源程序 (liberr.c liberr.h)
2 编译
#gcc –c liberr.c –o liberr.o
3 创建静态库
#ar rcs liberr.a liberr.o
4 缩写测试程序 (errtest.c)
5静态编译测试程序
#gcc errtest.c –o errtest –static –L. –lerr
注:此时可用nm,file查看文件属性
6 运行测试程序
西南林学院计算机系 贺金平
#./errtest
TM
80
80
静态编译选项说明
#gcc errtest.c –o errtest –static –L. –lerr
其中注意红色字体部分
-static是指静态编译
-L. -L是指定库路径,“点”代表当前路径
-lerr -l是指定哪个库,意思是指定去找liberr库
西南林学院计算机系 贺金平
TM
81
81
11.4 编写并使用共享库
目的:编译一个共享库,并用测试程序测试该共享库
具体步骤如下:
1 编辑源程序 (liberr.c liberr.h)
2 编译
#gcc –c liberr.c –o liberr.o
3 链接库
#gcc –shared –W1,-soname,liberr.so –o liberr.so.1.0.0 liberr.o
4 建立符号链接
Ln –s liberr.so.1.0.0 liberr.so.1
Ln-s liberr.so.1.0.0 liberr.so
西南林学院计算机系 贺金平
TM
82
82
5 缩写测试程序 (errtest.c)
6 动态编译测试程序(默认即为动态编译)
#gcc errtest.c –o errtest –L. –lerr
注:此时可用ldd,nm,file查看文件属性
7 运行测试程序
#LD_LIBRARY_PATH=$(pwd) ./errtest
西南林学院计算机系 贺金平
TM
83
83
本章结束,谢谢!
西南林学院计算机系 贺金平
TM
84
84