第 1 讲 linux 编程工具包

84
1 TM 南南南南南南南南 南南南 南南南南 西 南南南 南南南南—— GNU/Linux 南南 南 1 南 Linux 南南南南南 南南 : 南南南

Upload: aran

Post on 12-Jan-2016

164 views

Category:

Documents


6 download

DESCRIPTION

主讲 : 贺金平. 第 1 讲 Linux 编程工具包. 本讲内容目录. 1 Linux 历史与版本 2 Linux 操作系统安装 3 Linux 常用命令 4 vi 编辑器 5 使用 GNU CC ( gcc ) 6 Make 管理项目 7 autotools 8 RCS 与 CVS 版式本控制 9 GDB 调试 10 出错处理 11 使用库. 1.1 Linux 历史与版本. Linux 是一种类 Unix 操作系统,是一个完全免费的操作系统 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 1 讲  Linux 编程工具包

1TM西南林学院计算机系 贺金平 版权所有

操作系统接口编程—— GNU/Linux 编程

第 1 讲 Linux 编程工具包

主讲 : 贺金平

Page 2: 第 1 讲  Linux 编程工具包

2TM 2西南林学院计算机系 贺金平

本讲内容目录

1 Linux 历史与版本 2 Linux 操作系统安装 3 Linux 常用命令 4 vi 编辑器 5 使用 GNU CC ( gcc ) 6 Make 管理项目 7 autotools

8 RCS 与 CVS 版式本控制 9 GDB 调试 10 出错处理 11 使用库

Page 3: 第 1 讲  Linux 编程工具包

3TM 3西南林学院计算机系 贺金平

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 贡献的

Page 4: 第 1 讲  Linux 编程工具包

4TM 4西南林学院计算机系 贺金平

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

Page 5: 第 1 讲  Linux 编程工具包

5TM 5西南林学院计算机系 贺金平

国内外主要发行版本

国外:

1 . Red Hat Linux (fedora Linux)

2 . SuSE Linux

3 . Debian Linux (Ubuntu Linux)

4 . Mandrake Linux

5. Gentoo Linux

国内 :

1 .红旗 Linux

2 .中标普华 Linux

3 .共创 Linux

4 .冲浪 Linux

5. 蓝点 Linux

Page 6: 第 1 讲  Linux 编程工具包

6TM 6西南林学院计算机系 贺金平

2 Linux 操作系统安装

2.1 Linux 系统安装 2.2 WMware 虚拟机安装 2.3 虚拟机工具 (wmtools) 安装 2.4 设定共享目录

Page 7: 第 1 讲  Linux 编程工具包

7TM 7西南林学院计算机系 贺金平

2.1 Linux 系统安装

安装光盘: red hat linux 安装光盘有三张,可在网上下载 ISO文件

分区: red hat linux 安装至少要三个分区:启动分区 (/boot)、交换分区 (swap) 、根分区 (/)

SWAP 分区: linux 在硬盘上划出一个区域来当作临时内存,相当于 windows 系统中的虚拟内存,一般将其设为内存大的 2倍

Grub:linux 系统的引导装载器。 Root 权限: linux 是一个多用户操作系统。 Root 是超级用户 安装硬件要求:硬盘空间建议大于 3G ,内存建议大于 256M

Page 8: 第 1 讲  Linux 编程工具包

8TM 8西南林学院计算机系 贺金平

Linux 安装步骤及注意事项

安装步骤 :详见安装图解 注意事项 :

作为嵌入式系统开发,建议在 VMware Workstation 软件中安装虚拟机,硬盘空间建议 6G~12G

分区时选择手动分区 安装过程中 , 切记 root 用户的密码

Page 9: 第 1 讲  Linux 编程工具包

9TM 9西南林学院计算机系 贺金平

2.3 虚拟机及工具 (wmtools) 安装

安装 VMware Workstation 5.0.0 build-13124 虚拟机

安装 WMware Tools

Page 10: 第 1 讲  Linux 编程工具包

10TM 10西南林学院计算机系 贺金平

安装 WMware Tools

如果不安装此工具包,鼠标进入到虚拟机后,要按下 CTRL+ALT组合键 才能将鼠标退出到 windows 系统,操作起来比较麻烦。

安装方法如下:

Page 11: 第 1 讲  Linux 编程工具包

11TM 11西南林学院计算机系 贺金平

安装方法如下

#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 ,可以解决这个问题。

Page 12: 第 1 讲  Linux 编程工具包

12TM 12西南林学院计算机系 贺金平

2.4 设定共享目录

Page 13: 第 1 讲  Linux 编程工具包

13TM 13西南林学院计算机系 贺金平

Page 14: 第 1 讲  Linux 编程工具包

14TM 14西南林学院计算机系 贺金平

查看共享目录

# /mnt/hgfs/hjp/ 共享设置完毕后, linux 系统中会有此目录,把 windows 中的文件拷贝到 E:\vmshare 目录,再去虚拟机的 /mnt/hgfs/hjp 看看文件是否在那里了,如果操作无误,则共享目录设置成功。

Page 15: 第 1 讲  Linux 编程工具包

15TM 15西南林学院计算机系 贺金平

3 Linux 常用命令 #cd .. // 进入上一级目录 #ls -l ls -a //显示文件 -l详细 ,-a显示隐藏 #mkdir filepath // 建立目录 #rm –rf filepath //删除目录 #touch helloworld.c vi helloworld.c // 建立新文件 #cp helloworld.c /root/hello.c //拷贝文件并改名 #cp –a filepath /root //拷贝目录 (带链接 )

#mv helloworld.c /root/hello.c //移动文件并改名 # rm –f helloworld.c //删除文件

Page 16: 第 1 讲  Linux 编程工具包

16TM 16西南林学院计算机系 贺金平

Linux 常用命令 (续 )

#find . –name hello.c // 在当前目录及子目录查找文件 #grep –R “printf” . // 查看当前目录中包含 printf 的文件 #file helloworld.c //显示文件属性 #uname –r //显示当前内核版本 #who //显示当前登录用户 #tar zxvf filepath.tar.gz //解压 .tar.gz 文件 #tar zcvf filepath.tar.gz filepath //压缩 .tar.gz

#tar jxvf filepath.tar.bz2 //解压 .tar.bz2 文件 #tar jcvf filepath.tar.bz2 filepath //压缩 .tar.bz2

Page 17: 第 1 讲  Linux 编程工具包

17TM 17西南林学院计算机系 贺金平

Linux 常用命令 (续 )

#cat hello.c //显示文件内容 #chmod 755 hello // 为 hello 文件设置权限 #pwd // 查看当前目录的绝对路径 #mount //挂载设备到目录 #unmount //卸载 #export //声明环境变量 #exit //关闭当前终端 #man find

#help

Page 18: 第 1 讲  Linux 编程工具包

18TM 18西南林学院计算机系 贺金平

Linux 常用命令 (续 )

#insmod //加载模块 #lsmod // 查看已加载模块 #rmmod //卸载模块 #ps –e // 查看当前所有运行的进程 #kill //结束某进行 #reboot // 重启系统 #halt //关机 #ifconfig // 查看 (配置 )IP地址 #ping

Page 19: 第 1 讲  Linux 编程工具包

19TM 19西南林学院计算机系 贺金平

4 vi 编辑器

Vi 是一个高级文本编辑器。它可以执行输出、删除、查找、替换等众多文本操作而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的。

Vi 有三种基本工作模式:命令行模式,文本输入模式,末行模式。

Page 20: 第 1 讲  Linux 编程工具包

20TM 20西南林学院计算机系 贺金平

Vi 三种工作模式

命令行模式:不管处于何种模式,只要按一下 ESC键即可使 vim 进入命令行模式;此时从键盘上输入的任何字符都被当作编辑命令来解释。

文本输入模式:在命令模式下输入插入命令 i 等都可以进入文本输入模式;在该模式下输入的任何字符都被当做文件内容保存起来。

末行模式:在命令模式下按“ : 键”即可进入末行模式;此时会在显示窗口的末行显示一个冒号作为末行模式的提示符,等待用户输入命令。

Page 21: 第 1 讲  Linux 编程工具包

21TM 21西南林学院计算机系 贺金平

vi 的进入与退出

进入 vi :在 shell模式下键入 vi 及需要编辑的文件名即可。例如: vi example.txt

退出 vi :首先按 ESC键进入命令模式,然后输入 : 进入末行模式,末行模式下输入 q直接退出; wq (或 x )保存后退出; q!不保存强制退出。

Page 22: 第 1 讲  Linux 编程工具包

22TM 22西南林学院计算机系 贺金平

光标移动操作

vi 中的光标移动既可以在命令模式,下也可以在文本输入模式下。

在文本输入模式下可直接使用键盘上的四个方向键移动光标。

在命令模式下除了使用四个方向键还可以用 h (左)、 l (右)、 j (上)、 k (下)这四个键来移动光标。(熟练后可以达到手不离键,从而提高工作效率)

快速移动命令: 0 (零)光标移到行首; $ 光标移到行尾; nG 光标移到第 n 行; H 光标移到屏幕上显示的第一行; L 光标移到屏幕上显示的最后一行; M 光标移到屏幕的中间一行。

Page 23: 第 1 讲  Linux 编程工具包

23TM 23西南林学院计算机系 贺金平

文本插入操作

1. 插入命令: i 命令,插入文本从光标所在位置前开始,屏幕末行显示“ --INSERT --”提示字样。 I 移到该行行首,在其前插入文本。

2. 附加命令: a 命令,该命令用于在光标当前所在位置之后追加新文本,新输入的文本被放在光标之后。 A 移到行尾,在其后插入文本。

3. 添行命令: o 命令,该命令将在光标所在行的下面新开一行,并将光标置于该行的行首,等待输入文本; O 是在光标所在行的上面插入一行。

Page 24: 第 1 讲  Linux 编程工具包

24TM 24西南林学院计算机系 贺金平

文本修改操作

1. 文本删除 / 移动; 删除单个字符: x删除光标处的字符; nx删除从光标所在位置开始向右的 n 个字符; X删除光标前面的那个字符; nX删除从光标前面开始向左的 n 个字符。

删除多个字符: dd删除光标所在的整行; dw删除一个单词; d0删除从光标前一个字符开始到行首的内容; d$( 或D)删除从光标所在处开始到行尾的内容。

2. 文本复制命令; yy复制光标所在的整行,可以使用 p 命令粘贴。( dd 类似与剪切)

3. 撤销与重做命令: u支持多次撤销, U单次撤销。在命令模式下按“ .” (点号)键既可重做。

Page 25: 第 1 讲  Linux 编程工具包

25TM 25西南林学院计算机系 贺金平

文本搜索与替换

1. 模式搜索命令:

“/” 命令,从光标位置向文件尾部搜索键入的模式,搜索下一个匹配使用 n ,搜索上一个匹配使用 N ;

“?” 命令,从光标位置向文件头部搜索。

2. 文本替换命令:(必须在末行模式下操作)

:s/text1/text2 将光标所在段落搜索到的第一个 text1替换为 text2 ;

:s/text1/text2/g 将光标所在段落的所有 text1替换为 text2 ;

:1,$s/text1/text2/g 替换所有符合条件的字符( 1,$ 表示搜索范围是从首行到末行)

Page 26: 第 1 讲  Linux 编程工具包

26TM 26西南林学院计算机系 贺金平

5 使用 GNU CC ( gcc )编译器

GNU CC(简称为 Gcc) 是 GNU 项目中符合 ANSI C 标准的编译系统 , 能编译 C 、 C++ 等语言编写的程序。

Page 27: 第 1 讲  Linux 编程工具包

27TM 27西南林学院计算机系 贺金平

GCC 编译流程解析

GCC 编译流程分为 4 个步骤:( 1 )预处理 (pre-processing)

( 2 )编译 (compiling)

( 3 )汇编 (assembling)

( 4 )链接 (linking)

GCC指令的一般格式:Gcc [选项 ] 源文件 [选项 ] 目标文件其中,目标文件可缺省, Gcc默认生成可执行的文件 , 名为”编译文件 .

out”

Page 28: 第 1 讲  Linux 编程工具包

28TM 28西南林学院计算机系 贺金平

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

Page 29: 第 1 讲  Linux 编程工具包

29TM 29西南林学院计算机系 贺金平

GCC 编译选项分析 (1)

Page 30: 第 1 讲  Linux 编程工具包

30TM 30西南林学院计算机系 贺金平

GCC 编译选项分析 (2)

Page 31: 第 1 讲  Linux 编程工具包

31TM 31西南林学院计算机系 贺金平

GCC 编译选项分析 (3)

Page 32: 第 1 讲  Linux 编程工具包

32TM 32西南林学院计算机系 贺金平

6 Make 管理项目

6.1 Make 工程管理器 6.2 Makefile 文件格式及规则

Page 33: 第 1 讲  Linux 编程工具包

33TM 33西南林学院计算机系 贺金平

6.1Make 工程管理器

Make 工程管理器:顾名思义,是指管理较多的文件的。如果一个应用要涉及很多个程序文件,手工用 GCC 一个个去编译将是一件很麻烦的事情;另外,编译一次后,根据需要如果只部分程序做了改动,则应只需重新编译改过后的文件,人们希望有一个工程管理器能自动识别更新了的文件代码,同时又不需要重复输入冗长的命令长,于是, make 工程管理器就应运而生了。

Page 34: 第 1 讲  Linux 编程工具包

34TM 34西南林学院计算机系 贺金平

6.2 Makefile 文件格式及规则

Makefile 是 make读入的惟一的配置文件,本节要讲的实际上就是 makefile 文件的编写规则。

一个 Makefile 中通常包含如下内容: 需要由 make 工具创建的目标体 (target), 通常是目标文件或可执行文件 要创建的目标体所依赖的文件 (dependency_file) 创建每个目标体时需要运行的命令 (command)

Makefile 是格式为:target : dependency_file

command

注意 : (1)每个 command 前必须有 Tab符 (2)Makefile 中使用” #” 注释程序

Page 35: 第 1 讲  Linux 编程工具包

35TM 35西南林学院计算机系 贺金平

一个简单的例子

#the simplest example

Hello.o:hello.c hello.h

gcc –c hello.c -o hello.o

注意: gcc 前是一个 tab符

Page 36: 第 1 讲  Linux 编程工具包

36TM 36西南林学院计算机系 贺金平

Makefile 中使用变量

为了简化编辑和维护Makefile,允许在 Makefile 中创建和使用变量,变量是在 Makefile 中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。在具体要求下,这些值可以代替目标体、依赖文件、命令以及 Makefile 文件中的其他部分。

Makefile 中的变量有两种方式:递归展开方式和简单方式。递归展开方式是指定义的变量又在引用其他的变量,在使用该变量时一次性将内嵌的变量全部展开,这种方式的缺点是有时会导致变量的循环引用。简单展开方式定义的变量在定义处展开,并且只展开一次,因此它不含任何其他变量的引用。

Page 37: 第 1 讲  Linux 编程工具包

37TM 37西南林学院计算机系 贺金平

关于变量名

递归展开方式为: VAR=var

简单展开方式为: VAR:=var

Make 中引用变量均使用格式 : $(VAR)

变量名是不包括” :” 、” #” 、“ =”结尾空格的任何字符。同时变量名中包含字母、数字和下划线以外的情况尽量避免,因为它们可能存在特定的含义

变量名是区分大小写的。即 foo 和 Foo代表不同的变量。

Page 38: 第 1 讲  Linux 编程工具包

38TM 38西南林学院计算机系 贺金平

例子 :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

Page 39: 第 1 讲  Linux 编程工具包

39TM 39西南林学院计算机系 贺金平

Makefile变量的分类

Makefile 中的变量分为用户自定义变量、预定义变量、自动变量及环境变量。

上例中 OBJS 就是用户自定义变量,由用户自行设定,而预定义变量和自动变量为通常在 Makefile 中都会出现的变量,其中部分有默认值,当然用户也可以对其进行修改。

自动变量:由于常见的 GCC 编译语句中通常包含了目标文件和依赖文件,为了简化Makefile 的编写,就引入了自动变量。自动变量通常可以代表编译语句中出现的目标文件和依赖文件,并且具有本地含义 (即下一语句出现的相同变量代表的是下一句的目标文件和依赖文件 )

环境变量:系统自动读取当前系统环境变量。如果用户自定义变量与之重名,则用户自定义变量将覆盖同名的环境变量 .

Page 40: 第 1 讲  Linux 编程工具包

40TM 40西南林学院计算机系 贺金平

Makefile 中常见的预定义变量

Page 41: 第 1 讲  Linux 编程工具包

41TM 41西南林学院计算机系 贺金平

Makefile 中常见的自动变量

Page 42: 第 1 讲  Linux 编程工具包

42TM 42西南林学院计算机系 贺金平

例子:自动变量使用

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 $@

Page 43: 第 1 讲  Linux 编程工具包

43TM 43西南林学院计算机系 贺金平

Makefile 规则

Makefile 规则是 make 进行处理的依据,它包括了目标体、依赖文件及其之间的命令语句。一般来说, Makefile 中的一条语句就是一个规则。如上例中都显示地指出了 Makefile 中的规则关系,如“ $(CC) $(CFLAGS) –c $^ –o $@“,为了简化Makefile 的编写, make还定义了隐式规则和模式规则。

Page 44: 第 1 讲  Linux 编程工具包

44TM 44西南林学院计算机系 贺金平

(1)隐式规则

隐式规则能告诉make怎样使用传统的技术完成任务,当用户使用它们时不必详细指定编译的具体细节,而只需把目标文件列出即可。 Make会自动搜索隐式规则目录来确定如何生成目标文件。

上例可写成:OBJS=he.o jin.o ping.o

CC=gcc

CFLAGS=-Wall –o –g

Hjp:$(OBJS)

$(CC) $^ -o $@

Page 45: 第 1 讲  Linux 编程工具包

45TM 45西南林学院计算机系 贺金平

为什么可以省略后面几句?

因为 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 文件生成

Page 46: 第 1 讲  Linux 编程工具包

46TM 46西南林学院计算机系 贺金平

Makefile 中常见的隐式规则目录

Page 47: 第 1 讲  Linux 编程工具包

47TM 47西南林学院计算机系 贺金平

(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 $@

Page 48: 第 1 讲  Linux 编程工具包

48TM 48西南林学院计算机系 贺金平

Make 管理器的使用

Make 使用时其后输入目标名即可建立指定的目标,如果直接运行 make, 建立Makefile 中的第一个目标。 Make 命令有丰富的选项以完成不同的功能。

Page 49: 第 1 讲  Linux 编程工具包

49TM 49西南林学院计算机系 贺金平

例子

/*main.c*/

#include "mytool1.h"

#include "mytool2.h"

int main(){

mytool1_print("hello");

mytool2_print("hello");

}

Page 50: 第 1 讲  Linux 编程工具包

50TM 50西南林学院计算机系 贺金平

/*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

Page 51: 第 1 讲  Linux 编程工具包

51TM 51西南林学院计算机系 贺金平

/*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);

}

Page 52: 第 1 讲  Linux 编程工具包

52TM 52西南林学院计算机系 贺金平

编写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

Page 53: 第 1 讲  Linux 编程工具包

53TM 53西南林学院计算机系 贺金平

简化后的 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

Page 54: 第 1 讲  Linux 编程工具包

54TM 54西南林学院计算机系 贺金平

再次简化后的 Makefile 文件

#this is Makefile

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

%.o:%.c %.h

gcc –c $<

clean:

rm -f *.o main

Page 55: 第 1 讲  Linux 编程工具包

55TM 55西南林学院计算机系 贺金平

7 autotools 使用

上一节中,我们了解到 Makefile 可以帮助make 完成它的使命,但要承认的一点是,编写Makefile确实不是一件容易的事,特别是较大的项目更是如此。那么有没有一种轻松的手段生成 Makefile 而同时又能让用户享受make 的优越性呢?

本节讲到的 autotools 系列工具正是为此而设计的,它只需用户输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成 Makefile 了,这无疑是广大用户所希望的。

Page 56: 第 1 讲  Linux 编程工具包

56TM 56西南林学院计算机系 贺金平

Autotools 系列工具

首先要确认系统是否安装了以下工具(可用 which 命令查看) Autoscan Aclocal Autoconf Autoheader Automake

具体使用方法见: autotools 使用 .doc

Page 57: 第 1 讲  Linux 编程工具包

57TM 57西南林学院计算机系 贺金平

8 RCS 与 CVS 版本控制

版本控制是指跟踪和管理源代码文件变化的自动过程。主要应用在多人协作完成一个项目时,实现程序的集中化管理。便于项目的整体控制、单元调试和整体调试。

8.1 RCS 版本控制 8.2 CVS 版本控制

Page 58: 第 1 讲  Linux 编程工具包

58TM 58西南林学院计算机系 贺金平

8.1 RCS 版本控制

RCS 版本控制主要涉及两个命令: ci 和 co

概念理解 检入: 把修改后的程序上传到服务器 检出:把服务器上的程序下载到客户端

Page 59: 第 1 讲  Linux 编程工具包

59TM 59西南林学院计算机系 贺金平

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

Page 60: 第 1 讲  Linux 编程工具包

60TM 60西南林学院计算机系 贺金平

RCS 版本控制 :注意事项

注意事项 1 不要删除 yo.c,v 工作文件 ;

2 检出时须加上 -l参数,否则修改的将会是只读文件,而且修改完以后不能检入 ;

3 如果检出时忘记加 -l参数了,可直接将 yo.c删除,重新带参数检出 ;

4 如果对方正检出并打开文件在修改,自已不能再次检出,只能以只读方式打开。如果操作不慎,可能会产生交换文件 (.swp) ,注意交换文件是隐藏文件,通过 ls –a 查看,最好将其删除。

Page 61: 第 1 讲  Linux 编程工具包

61TM 61西南林学院计算机系 贺金平

8.2 CVS 版本控制

CVS 是建立在 RCS 基础之上的,是对 RCS 的功能扩展。 CVS 优点: 1 比 RCS更适合于管理多目录的项目 2 能处理分布式项目。分别处理地理位置不同的多名开发人员在访问和操作同一个代码库。

而 RCS 通过其加加锁机制,一个时刻只能允许一个人编辑某个文件, CVS却没有这样的限制。

注意: CVS 版本控制不能以 root 用户进行操作,否则不能检入(即 cvs commit file会失败)

Page 62: 第 1 讲  Linux 编程工具包

62TM 62西南林学院计算机系 贺金平

(CVS) 具体方法如下:

创建源代码库,用 cvs init初始化该库。

#cvs –d $HOME/cvs init

设置环境变量 #export CVSROOT=$HOME/cvs

源码导入 cvs

#cd c08

#cvs import –m “ok” c08 lpu2 start

Page 63: 第 1 讲  Linux 编程工具包

63TM 63西南林学院计算机系 贺金平

(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 //检入

Page 64: 第 1 讲  Linux 编程工具包

64TM 64西南林学院计算机系 贺金平

9 GDB 调试

GDB功能:对程序进行跟踪调试。 1 能判断是程序出错的行数 2 能设置断点 (增加和删除断点、按行或按函数名设置断点

、按条件设置断点 )

3 能单步调试程序(即单步运行) 4 能实时打印变量的值 5 能显示变量的数据类型,函数的返回值类型 6 程序运行中能设置变量的值

Page 65: 第 1 讲  Linux 编程工具包

65TM 65西南林学院计算机系 贺金平

示例 :

以 debugme.c 程序为例 编译程序: #gcc debugme.c –o debugme -g

注意:加上 -g参数是为了在 debugme 目标文件中加入调试信息,以便于 GDB 调试

开始 GDB 调试

# gdb debugme

结束 GDB 调试

(gdb)quit

Page 66: 第 1 讲  Linux 编程工具包

66TM 66西南林学院计算机系 贺金平

具体方法

1 判断是程序出错的行数:如果程序中有段错误,则程序会自动显示出错误的行数。

2 设置断点

按行添加断点 (gdb) break 24 // 在程序 24 行中添加断点

按函数名添加断点 (gdb) break func //func函数处设断点

按条件设置断点 (gdb) break 24 if i==15 //24 行代码中如果i=15 ,则程序停在此断点处

查点断点信息 (gdb) info break //每个断点都会有个编号

删除断点 (gdb) delete n //n 为第几个断点

Page 67: 第 1 讲  Linux 编程工具包

67TM 67西南林学院计算机系 贺金平

具体方法 (续 ) 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

Page 68: 第 1 讲  Linux 编程工具包

68TM 68西南林学院计算机系 贺金平

10 出错处理

程序中对库函数以及用户函数的调用设置错误检测,确保函数调用返回值错误导致程序异常中止时能向用户报告出错信息。

本节将简要介绍一下出错处理函数。

Page 69: 第 1 讲  Linux 编程工具包

69TM 69西南林学院计算机系 贺金平

10.1 assert宏

#include <assert.h>

Void assert(int expression);

作用:先计算表达式 expression ,如果其值为假 (0), 那么它首先向 stderr打印一条出错信息,然后通过 abort函数来终止程序运行。

示例见教材 P123 例 9.1

Page 70: 第 1 讲  Linux 编程工具包

70TM 70西南林学院计算机系 贺金平

__LINE__ 和 __FILE__宏

作用:提示用户程序出错的行。 详见教材 P125 例 9.2 , 9.3 , 9.4

Page 71: 第 1 讲  Linux 编程工具包

71TM 71西南林学院计算机系 贺金平

标准库函数

#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 的常见值及其含义。

Page 72: 第 1 讲  Linux 编程工具包

72TM 72西南林学院计算机系 贺金平

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 地址错误

Page 73: 第 1 讲  Linux 编程工具包

73TM 73西南林学院计算机系 贺金平

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 用户数太多

Page 74: 第 1 讲  Linux 编程工具包

74TM 74西南林学院计算机系 贺金平

11 使用库

编程库有两个主要优点:它们能够实现代码重用。

本节将介绍以下内容: 11.1 命名和编号约定 11.2 库操作工具 11.3 环境变量和配置文件 11.4 编写并使用静态库 11.5 编写并使用共享库

Page 75: 第 1 讲  Linux 编程工具包

75TM 75西南林学院计算机系 贺金平

11.1 命名和编号约定

约定 1 :库名都以 lib 开头 约定 2 :静态库以 .a结尾;共享库以 .so结尾 约定 3 :版本约定。

示例 libgdbm.so.2.1.0

库名: libgdbm.so

主版本号: 2

次版本号: 1

补丁号: 0 (又名:发行号)

Page 76: 第 1 讲  Linux 编程工具包

76TM 76西南林学院计算机系 贺金平

约定 3 补充说明

当库的变化达到了和以前的版本不能兼容时,要增加主版本号;

当库有了新变化,但能和以前的版本兼容时,要增加次版本号;

修正库中错误而进行的改动时,改变补丁号;

Page 77: 第 1 讲  Linux 编程工具包

77TM 77西南林学院计算机系 贺金平

11.2 库操作工具

1 nm 命令

功能:例出编入目标文件或二进制文件的所有符号。可查看程序调用了什么函数;也可查看一个给定的库或目标文件是否提供了所需的函数。

用法 : nm fileName

2 ar 命令

功能:创建静态库

用法: ar rcs liberr.a liberr.o

Page 78: 第 1 讲  Linux 编程工具包

78TM 78西南林学院计算机系 贺金平

库操作工具 (续 )

3 ldd 命令

功能:例出程序正常运行所依赖 (需要 ) 的共享库

用法 : ldd fileName

4 ldconfig 命令

功能:创建和维护对最新版本共享库的链接

用法 : ldconfig libs

Page 79: 第 1 讲  Linux 编程工具包

79TM 79西南林学院计算机系 贺金平

11.3 环境变量和配置文件

动态链接器 /加载器 ld.so 使用两个环境变量。 LD_LIBRARY_PATH // 一般都使用该变量

以冒号分隔的目录清单,在这些目录下可搜索运行时的共享库

对应配置文件: /etc/ld.so.conf

LD_PRELOAD

以空格分隔的目录清单,它需要在其他所有库加载之前加载

对应配置文件: /etc/ld.so.preload

Page 80: 第 1 讲  Linux 编程工具包

80TM 80西南林学院计算机系 贺金平

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

Page 81: 第 1 讲  Linux 编程工具包

81TM 81西南林学院计算机系 贺金平

静态编译选项说明

#gcc errtest.c –o errtest –static –L. –lerr

其中注意红色字体部分

-static 是指静态编译

-L. -L 是指定库路径,“点”代表当前路径

-lerr -l 是指定哪个库,意思是指定去找 liberr 库

Page 82: 第 1 讲  Linux 编程工具包

82TM 82西南林学院计算机系 贺金平

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

Page 83: 第 1 讲  Linux 编程工具包

83TM 83西南林学院计算机系 贺金平

5 缩写测试程序 (errtest.c)

6 动态编译测试程序 (默认即为动态编译 )

#gcc errtest.c –o errtest –L. –lerr

注:此时可用 ldd , nm , file 查看文件属性

7 运行测试程序

#LD_LIBRARY_PATH=$(pwd) ./errtest

Page 84: 第 1 讲  Linux 编程工具包

84TM 84西南林学院计算机系 贺金平

本章结束,谢谢!