840 likes | 1.22k Views
主讲 : 贺金平. 第 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 操作系统,是一个完全免费的操作系统
E N D
主讲: 贺金平 第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操作系统,是一个完全免费的操作系统 • Linux最早是Linus Torvalds (李纳斯·托沃兹 )于1991年在芬兰赫尔辛基大学原创开发的,并在GNU的GPL(General Public License)原则下发行。 • GNU:为推广自由软件的精神而实现一个自由的操作系统,然后从应用程序开始,实现其内核.linux优良的内核性能使GNU采用了linux内核并进行开发。 • GPL:通用公共协议,是一个开放而又严格的许可协议,它规定了源码必须可以无偿的获得且可修改. • Linux又称为GNU/linux,其中许多重要的工具如gcc、gdb、make、emacs等都是GNU贡献的
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
国内外主要发行版本 国外: 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
2 Linux操作系统安装 • 2.1 Linux系统安装 • 2.2 WMware虚拟机安装 • 2.3 虚拟机工具(wmtools)安装 • 2.4 设定共享目录
2.1 Linux系统安装 • 安装光盘:red hat linux安装光盘有三张,可在网上下载ISO文件 • 分区:red hat linux安装至少要三个分区:启动分区(/boot)、交换分区(swap)、根分区(/) • SWAP分区:linux在硬盘上划出一个区域来当作临时内存,相当于windows系统中的虚拟内存,一般将其设为内存大的2倍 • Grub:linux系统的引导装载器。 • Root权限:linux是一个多用户操作系统。Root是超级用户 • 安装硬件要求:硬盘空间建议大于3G,内存建议大于256M
Linux安装步骤及注意事项 • 安装步骤:详见安装图解 • 注意事项: • 作为嵌入式系统开发,建议在VMware Workstation软件中安装虚拟机,硬盘空间建议6G~12G • 分区时选择手动分区 • 安装过程中,切记root用户的密码
2.3 虚拟机及工具(wmtools)安装 • 安装VMware Workstation 5.0.0 build-13124虚拟机 • 安装WMware Tools
安装WMware Tools • 如果不安装此工具包,鼠标进入到虚拟机后,要按下 CTRL+ALT组合键 才能将鼠标退出到windows系统,操作起来比较麻烦。 • 安装方法如下:
安装方法如下 #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,可以解决这个问题。
查看共享目录 • # /mnt/hgfs/hjp/ 共享设置完毕后,linux系统中会有此目录,把windows中的文件拷贝到E:\vmshare目录,再去虚拟机的/mnt/hgfs/hjp看看文件是否在那里了,如果操作无误,则共享目录设置成功。
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 //删除文件
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
Linux常用命令(续) • #cat hello.c //显示文件内容 • #chmod 755 hello //为hello文件设置权限 • #pwd //查看当前目录的绝对路径 • #mount //挂载设备到目录 • #unmount //卸载 • #export //声明环境变量 • #exit //关闭当前终端 • #man find • #help
Linux常用命令(续) • #insmod //加载模块 • #lsmod //查看已加载模块 • #rmmod //卸载模块 • #ps –e //查看当前所有运行的进程 • #kill //结束某进行 • #reboot //重启系统 • #halt //关机 • #ifconfig //查看(配置)IP地址 • #ping
4 vi编辑器 • Vi是一个高级文本编辑器。它可以执行输出、删除、查找、替换等众多文本操作而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的。 • Vi有三种基本工作模式:命令行模式,文本输入模式,末行模式。
Vi三种工作模式 • 命令行模式:不管处于何种模式,只要按一下ESC键即可使vim进入命令行模式;此时从键盘上输入的任何字符都被当作编辑命令来解释。 • 文本输入模式:在命令模式下输入插入命令i等都可以进入文本输入模式;在该模式下输入的任何字符都被当做文件内容保存起来。 • 末行模式:在命令模式下按“: 键”即可进入末行模式;此时会在显示窗口的末行显示一个冒号作为末行模式的提示符,等待用户输入命令。
vi的进入与退出 • 进入vi:在shell模式下键入vi及需要编辑的文件名即可。例如:vi example.txt • 退出vi:首先按ESC键进入命令模式,然后输入:进入末行模式,末行模式下输入q直接退出;wq(或x)保存后退出;q!不保存强制退出。
光标移动操作 • vi 中的光标移动既可以在命令模式,下也可以在文本输入模式下。 • 在文本输入模式下可直接使用键盘上的四个方向键移动光标。 • 在命令模式下除了使用四个方向键还可以用h(左)、l(右)、j(上)、k(下)这四个键来移动光标。(熟练后可以达到手不离键,从而提高工作效率) • 快速移动命令:0(零)光标移到行首;$光标移到行尾;nG光标移到第n行;H光标移到屏幕上显示的第一行;L光标移到屏幕上显示的最后一行;M光标移到屏幕的中间一行。
文本插入操作 • 1. 插入命令:i命令,插入文本从光标所在位置前开始,屏幕末行显示“--INSERT --”提示字样。I 移到该行行首,在其前插入文本。 • 2. 附加命令:a命令,该命令用于在光标当前所在位置之后追加新文本,新输入的文本被放在光标之后。A 移到行尾,在其后插入文本。 • 3. 添行命令:o命令,该命令将在光标所在行的下面新开一行,并将光标置于该行的行首,等待输入文本;O 是在光标所在行的上面插入一行。
文本修改操作 • 1. 文本删除/移动; • 删除单个字符:x删除光标处的字符;nx删除从光标所在位置开始向右的n个字符;X删除光标前面的那个字符; nX删除从光标前面开始向左的n个字符。 • 删除多个字符:dd删除光标所在的整行;dw删除一个单词;d0删除从光标前一个字符开始到行首的内容;d$(或D)删除从光标所在处开始到行尾的内容。 • 2. 文本复制命令;yy复制光标所在的整行,可以使用p命令粘贴。(dd类似与剪切) • 3. 撤销与重做命令:u支持多次撤销,U单次撤销。在命令模式下按“.”(点号)键既可重做。
文本搜索与替换 1. 模式搜索命令: “/”命令,从光标位置向文件尾部搜索键入的模式,搜索下一个匹配使用n,搜索上一个匹配使用N; “?”命令,从光标位置向文件头部搜索。 2. 文本替换命令:(必须在末行模式下操作) :s/text1/text2 将光标所在段落搜索到的第一个text1替换为text2; :s/text1/text2/g 将光标所在段落的所有text1替换为text2; :1,$s/text1/text2/g 替换所有符合条件的字符( 1,$ 表示搜索范围是从首行到末行)
5 使用GNU CC(gcc)编译器 • GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能编译C、C++等语言编写的程序。
GCC编译流程解析 • GCC编译流程分为4个步骤: (1)预处理(pre-processing) (2)编译(compiling) (3)汇编(assembling) (4)链接(linking) GCC指令的一般格式: Gcc [选项] 源文件 [选项] 目标文件 其中,目标文件可缺省,Gcc默认生成可执行的文件,名为”编译文件.out”
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
6 Make管理项目 • 6.1 Make工程管理器 • 6.2 Makefile文件格式及规则
6.1Make工程管理器 • Make工程管理器:顾名思义,是指管理较多的文件的。如果一个应用要涉及很多个程序文件,手工用GCC一个个去编译将是一件很麻烦的事情;另外,编译一次后,根据需要如果只部分程序做了改动,则应只需重新编译改过后的文件,人们希望有一个工程管理器能自动识别更新了的文件代码,同时又不需要重复输入冗长的命令长,于是,make工程管理器就应运而生了。
6.2 Makefile文件格式及规则 • Makefile是make读入的惟一的配置文件,本节要讲的实际上就是makefile文件的编写规则。 • 一个Makefile中通常包含如下内容: • 需要由make工具创建的目标体(target),通常是目标文件或可执行文件 • 要创建的目标体所依赖的文件(dependency_file) • 创建每个目标体时需要运行的命令(command) • Makefile是格式为: target : dependency_file command 注意: (1)每个command前必须有Tab符 (2)Makefile中使用”#” 注释程序
一个简单的例子 #the simplest example Hello.o:hello.c hello.h gcc –c hello.c -o hello.o 注意:gcc前是一个tab符
Makefile中使用变量 • 为了简化编辑和维护Makefile,允许在Makefile中创建和使用变量,变量是在Makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。在具体要求下,这些值可以代替目标体、依赖文件、命令以及Makefile文件中的其他部分。 • Makefile中的变量有两种方式:递归展开方式和简单方式。递归展开方式是指定义的变量又在引用其他的变量,在使用该变量时一次性将内嵌的变量全部展开,这种方式的缺点是有时会导致变量的循环引用。简单展开方式定义的变量在定义处展开,并且只展开一次,因此它不含任何其他变量的引用。
关于变量名 • 递归展开方式为: VAR=var • 简单展开方式为: VAR:=var • Make中引用变量均使用格式: $(VAR) • 变量名是不包括”:”、”#”、“=”结尾空格的任何字符。同时变量名中包含字母、数字和下划线以外的情况尽量避免,因为它们可能存在特定的含义 • 变量名是区分大小写的。即foo和Foo代表不同的变量。
例子: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
Makefile变量的分类 • Makefile中的变量分为用户自定义变量、预定义变量、自动变量及环境变量。 • 上例中OBJS就是用户自定义变量,由用户自行设定,而预定义变量和自动变量为通常在Makefile中都会出现的变量,其中部分有默认值,当然用户也可以对其进行修改。 • 自动变量:由于常见的GCC编译语句中通常包含了目标文件和依赖文件,为了简化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 $^ –o $@ Jin.o:jin.c jin.h $(CC) $(CFLAGS) –c $< –o $@ Ping.o : ping.c ping.h $(CC) $(CFLAGS) –c $< –o $@
Makefile规则 • Makefile规则是make进行处理的依据,它包括了目标体、依赖文件及其之间的命令语句。一般来说,Makefile中的一条语句就是一个规则。如上例中都显示地指出了Makefile中的规则关系,如“$(CC) $(CFLAGS) –c $^ –o $@“,为了简化Makefile的编写,make还定义了隐式规则和模式规则。
(1)隐式规则 • 隐式规则能告诉make怎样使用传统的技术完成任务,当用户使用它们时不必详细指定编译的具体细节,而只需把目标文件列出即可。Make会自动搜索隐式规则目录来确定如何生成目标文件。 • 上例可写成: OBJS=he.o jin.o ping.o CC=gcc CFLAGS=-Wall –o –g Hjp:$(OBJS) $(CC) $^ -o $@
为什么可以省略后面几句? • 因为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文件生成
(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 $@
Make管理器的使用 • Make使用时其后输入目标名即可建立指定的目标,如果直接运行make,建立Makefile中的第一个目标。Make命令有丰富的选项以完成不同的功能。
例子 • /*main.c*/ • #include "mytool1.h" • #include "mytool2.h" • int main(){ • mytool1_print("hello"); • mytool2_print("hello"); • }
/*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