第3章-1 Linux编程环境

上传人:沈*** 文档编号:181597645 上传时间:2023-01-14 格式:PDF 页数:149 大小:488.85KB
收藏 版权申诉 举报 下载
第3章-1 Linux编程环境_第1页
第1页 / 共149页
第3章-1 Linux编程环境_第2页
第2页 / 共149页
第3章-1 Linux编程环境_第3页
第3页 / 共149页
资源描述:

《第3章-1 Linux编程环境》由会员分享,可在线阅读,更多相关《第3章-1 Linux编程环境(149页珍藏版)》请在装配图网上搜索。

1、以国家精品课程智能控制基础双语教学为平台,培养工科学生创新实践能力以国家精品课程智能控制基础双语教学为平台,培养工科学生创新实践能力汇报人:师黎第三章:第三章:Linux编程环境编程环境讲课人:罗勇讲课人:罗勇2?本章内容包括常用的本章内容包括常用的Linux开发工具使用技巧和开发工具使用技巧和Linux编程技术。本章内容比编程技术。本章内容比Linux编程方面的书籍简略得多,重点介绍常用的编程方面的书籍简略得多,重点介绍常用的Linux编程工具和技巧。通过本章学习可以使读者快速掌握基本的编程工具和技巧。通过本章学习可以使读者快速掌握基本的Linux开发工具,为后续的嵌入式开发工具,为后续的嵌

2、入式Linux开发打下基础。开发打下基础。本章目标?常用Linux编程工具?GNU工具链的使用技巧?Linux编程库的API介绍3.1 Linux常用工具常用工具?3.1.1 Shell简介简介?在Linux系统开发过程中,开发者或者用户与Linux系统(内核)进行交互的时候需要一个平台,这就是Shell(英译:壳),有了它,用户就能通过键盘输入与系统进行交互了。?Shell通过命令行(CLI)方式,执行用户输入指令,并在屏幕上显示。?单从字面意思上理解,Shell的本意是“壳”的意思,通俗地讲就是内部核心与外部使用者发生联系的介质。?Shell工作示意图?Shell提供了用户与操作系统之间通

3、讯的方式。这种通信可以以交互方式(从键盘输入,并且可以立即得到响应),或者以脚本:Shell script(非交互)方式执行。?Shell本身又是一个解释型的程序,也是一种编程语言,Shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。?Bash Shell是目前大多数Linux系统默认使用的Shell?Linux下,打开终端即可看到Shell提示符。普通用户为“$”,而对于根用户(root),提示符为“”?终端出现Shell提示符后,即可输入命令名称和所需要的参数。?若Shell找不到以其中的命令名为名字的程序,就会给出出错信息。例如:rootTe

4、mp$myfilebash:myfile:command not foundrootTemp3.1.2 常用常用Shell命令命令?1Shell命令可分为两种:1)包含于Shell内部的命令,如cd命令。2)存在于系统文件内部的某个应用程序,如ls命令?2Shell命令的一般格式命令名【选项】【参数1】【参数2】Shell遵循一定的语法将输入的命令解释并传给内核。第一部分必须是命令名、第二部分是选项和参数,是可选的。每部分必须用空格或Tab键格开。3选项和参数说明选项和参数说明?选项选项是包括一个或多个字母的代码,前面有减号,用于改变命令执行的动作类型,多个选项可用一个减号连接。如是包括一个或

5、多个字母的代码,前面有减号,用于改变命令执行的动作类型,多个选项可用一个减号连接。如“ls a l”与与“ls al”相同。如:相同。如:lsl命令中,选项命令中,选项l可以以长格式查看当前目录内容。显示文件的大小、权限、最后修改日期等信息。可以以长格式查看当前目录内容。显示文件的大小、权限、最后修改日期等信息。?参数参数提供命令运行信息,或执行过程中所用到的文件。如:提供命令运行信息,或执行过程中所用到的文件。如:ls l /home/zxq;将将/home/zxq目录内容详细列出。目录内容详细列出。?使用分号使用分号(;)可隔开两个命令,实现一行中输入多个命令。可隔开两个命令,实现一行中输

6、入多个命令。4命令行输入命令行输入?命令行输入实际上是可以编辑的一个文本缓冲区,在命令行中就可以输入命令行输入实际上是可以编辑的一个文本缓冲区,在命令行中就可以输入Shell命令了。在按命令了。在按“回车键回车键”以确认当前操作之前,可以对输入的内容进行编辑。以确认当前操作之前,可以对输入的内容进行编辑。?Bash可保存以前输入的列表,这一列表被称为命令历史表。按上下箭头键,就可实现在命令历史表中的移动,从而实现对以前历史命令的显示。可保存以前输入的列表,这一列表被称为命令历史表。按上下箭头键,就可实现在命令历史表中的移动,从而实现对以前历史命令的显示。5常用Shell命令介绍?(1)输入命令

7、行自动补齐(automatic command line completion)功能?(2)对目录和文件的操作?(3)用户管理?(4)文件的打包和压缩?(5)rpm软件包的安装?(6)源码维护基本命令:diff命令?(7)配置、编译、安装源码包软件?(8)中断Shell命令执行的方法?(9)模块管理指令5常用Shell命令介绍?(1)输入命令行自动补齐(automatic command line completion)功能:在输入命令行的任意时刻,按键,系统将试图补齐已输入的命令。例如:当前目录下只有一个以B开头的文件Busy.tar.gztar zxvfBusy.tar.gz?(2)对目录

8、和文件的操作?改变当前目录cd目的目录名?显示当前所在目录#pwd/home/TH?创建目录#mkdir 新目录名?删除一个目录rm 选项 被删除目录名选项:-r:完全删除目录,包含子目录和文件-i:在删除目录之前需要经过使用者确认-f:不需确认即可删除,不会产生错误信息?复制文件/目录#cp 选项 源文件/目录指定文件/目录选项:-i:对于已存在文件,提示确认是否覆盖。-p:保留权限模式和更改时间-f:将一个目录下的所有文件全部复制cp r dir1 dir2 ;将目录dir1中的全部内容复制到dir2(2)对目录和文件的操作之一?建立文件的符号链接:即为文件建立快捷方式ln-s 源文件 目

9、标文件-s:软链接参数,不会生成实际文件。如:ln s/bin/test /usr/local/test ;即为/bin下的test文件在/usr/local/目录下建立符号链接?改变文件/目录访问权限#chmod XYZ 文件XYZ各为一个数字,表示User、Group及Other对于该文件的权限。文件权限属性:r(可读)=4,w(可写)=4,x(可执行)1。例如chmod 751 /home/TH/test ;使程序test对于用户有可读、写、执行,对于同组用户可读、执行,对于其他用户可执行。(2)对目录和文件的操作之二?改变文件/目录所有权chown-R 用户名 文件/目录选项:-r:改

10、变目录所有权#chown-R TH Dir1 ;将目录Dir1改为用户TH所有(2)对目录和文件的操作之三?添加/删除用户adduser user1 ;由root权限用户添加user1userdel user2 ;由root权限用户删除user2?设置用户口令passwd;需要输入旧口令和新口令。(3)用户管理?打包与解包命令:tartar 选项f 目标文件名.tar 文件/目录选项:-f:必须的,通常用来指定包的文件名-c:创建新的档案文件#tar-cf one.tar/home/tmp;目录/tmp下文件打包为one.tar-r:增加文件到已有包#tar-rf one.tar*.jpg ;

11、将所有jpg文件添加到one.tar中-t:列出包文件所有内容#tar-tf one.tar/home/tmp;-x:从tar包文件中恢复所有文件,即文件解压#tar-xf one.tar/home/tmp;解压one.tar到/tmp目录(4)文件打包和压缩之一tar 选项f 目标文件名.tar 文件/目录选项:-k:保存已存在文件,如同名文件,不覆盖-w:每一步都确认?tar打包与解包同时,可调用其他压缩程序压缩文件?Linux主要压缩文件格式:1).Z compress程序的压缩格式2).bz2 bzip2程序的压缩格式3).gzgzip程序的压缩格式4).tar.gz由tar程序打包,

12、经gzip程序的压缩5).tar.bz2由tar程序打包,经bzip2程序的压缩(4)文件打包和压缩之二?tar打包同时调用gzip程序压缩选项=-ztar -czf one.tar.gz*.jpg;将当前目录所有jpg文件打成tar包,并由gzip生成压缩包tar -xzf one.tar.gz;调gunzip解压缩包到当前目录?tar打包同时调用bzip2程序压缩选项=-jtar -cjf one.tar.gz*.jpg;将当前目录所有jpg文件打成tar包,并由bzip2生成压缩包tar -xjf one.tar.gz;bunzip2解压缩包到当前目录(4)文件打包和压缩之三?rpm:软

13、件包管理器。可用来安装、查询、校验、更新rpm格式的软件包?rpm格式的软件包包含可执行的二进制程序,和该程序运行所需文件。?与源码安装相比,rpm易于安装、更新、卸载文件,也易于保护配置文件和跟踪已安装文件。(5)rpm软件包安装之一?安装rpm软件包格式:#rpm -i选项 软件名称选项:-i:安装rpm软件包-t:测试安装-h:安装时输出”#”,可显示安装进度-f:忽略安装错误-U:升级安装rpm软件包-e:卸载已安装rpm软件包-V:检测安装是否争取rpm -ivh one.rpm(5)rpm软件包安装之二?Diff命令:比较两文件差异。生成源代码补丁工具。diff 选项 旧文件新文件

14、选项:-r:递归处理相应目录-N:包含新文件到patch-u:输出统一格式(unified format),比缺省格式更紧凑。-a:可包含二进制文件到patchdiff -ruN old.txtnew.txt my.patch;比较 new与old文件的差异,并创建补丁文件(6)源码维护之一?patch命令:打补丁工具。patch -p数字补丁文件选项:-p数字:补丁文件名左边目录的层数。若补丁文件my.patch第一行:*/home/guest/my/old.txtpatch -p0 my.patch;更新文件/home/guest/my/old.txtpatch -p1 my.patch;

15、更新文件home/guest/my/old.txtpatch -p2 my.patch;更新文件guest/my/old.txtpatch -p4 my.patch;更新文件old.txt;-p数字XX,表示去掉XX个斜线(/)(6)源码维护之二?源码包软件就是源代码可见的软件包,以tar.bz2或tar.gz形式得到。先需要解压缩,再进入解压缩根目录?配置、编译、安装命令如下:./configure;配置make;编译make install;安装?./configure的参数-prefix可指定软件的安装目录:./configure -prefix=/home/tmp(7)配置、编译、安装

16、源码包软件?出现Shell提示符,可输入命令?终止命令执行,从键盘按:Ctrl+C(8)中断Shell命令执行的方法?Linux内核采用模块化管理方式。有些功能在需要时才载入内核,如设备驱动程序?添加删除模块指令:modprobe-lcf 模块名称选项:-c:列出当前系统所有模块-l:列出/lib/modules/uname-r/kernel中模块文件名-f:强制加载该模块。-r:删除模块。modprobe smbfs;加载smbfs模块,其完整文件名已记录在/lib/modules/uname-r/modules.dep中。modprobe-r smbfs;卸载 smbfs模块(9)模块管理

17、指令3.1.3 编写编写Shell脚本脚本?Shell不仅仅是命令的执行,而且是一种编程语言,它提供了定义变量和参数的手段以及丰富的程序控制结构?Shell擅长系统管理任务,可通过使用Shell使大量任务自动化,类似于Window的批处理命令,称为Shell脚本(Script)?Shell为解释型语言。1建立脚本建立脚本?编辑Shell脚本文件使用Linux下的普通编辑器如vi、Emacs等即可。Linux下的Shell默认采用Bash。Shell脚本首行“#!”开头,后面指出Shell路径。#!/bin/sh;由/bin目录下Bash程序解释执行?“#”开始到行尾部分可看作注释语句。2She

18、ll变量变量?Shell脚本中主要有以下几种变量:系统变量,环境变量,用户变量。变量取值均为字串。?用户变量:编程时使用?系统变量:对参数判断和命令返回值判断使用?环境变量:程序运行时设置?脚本不必编译,因此变量不必事先申明。2Shell变量之一:系统变量变量之一:系统变量?$#:程序命令行参数的数目?$?:前一个命令的返回值(非0表示出错)?$0:当前程序名?$*:以(”$1$2”)形式保存的输入命令行参数?$:以(”$1”$2”)形式保存的输入命令行参数?$1:命令行第一个参数?$n:命令行第n个参数2Shell变量之二:环境变量变量之二:环境变量?所有Shell程序都会接收的参数?PAT

19、H:寻找命令或程序的目录?HOME:用户主目录的完全路径名。?LOGNAME:用户登录名?HOSTNAME:主机名称?SHELL:Shell路径名?MAIL:用户邮件存储目录?PS1:主提示符。root用户为#,普通用户$?PS2:辅助提示符。默认”?TERM:终端类型?PWD:当前工作目录的绝对路径名2Shell变量之三:用户变量变量之三:用户变量?所有不含空格的字符串可作为用户变量?变量名前不应加符号$?用户变量赋值:变量名=变量值例如:A=“Hello”;等号两侧不能留空格。?变量引用,要在其前加$,例如:Echo$A3流程控制之一流程控制之一?同传统的编程语言一样,Shell提供了很多

20、特性,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及以中断处理等。(1)条件语句条件语句?if 语句if 表达式 then命令1;表达式为True时的动作else命令2;表达式为False时的动作fi3流程控制之二流程控制之二?case 语句case 字符串 in 模式1)命令11;命令12;模式2)命令21;命令22;*)esac3流程控制之三流程控制之三(2)循环语句循环语句?while循环语句while 表达式 do命令;表达式为True时的动作done?for循环语句for (初始值;限制值;执行步长)do命令done4Shell脚本的执行脚本的执行?如果已经写好She

21、ll脚本,运行该脚本可以有以下几种方法。?(1)设置好脚本的执行权限之后再执行脚本#chmod+x MyScript#./MyScript?(2)使用Bash内部指令source“#source MyScript?(3)直接使用sh命令来执行#sh MyScript后面两种方式不必设置权限即可执行3.1.4 正则表达式之一:定义正则表达式之一:定义?正则表达式是一种可以用于模式匹配和替换的有效工具。正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。?正则表达式由普通字符(例如字符a到z)以及特殊字符(称为特殊字符

22、)组成特定文字模式。当从一个文件或命令中抽取或者过滤文本时,使用正则表达式可以简化命令中的匹配表达。3.1.4 正则表达式之二:含义及匹配正则表达式之二:含义及匹配?匹配行首行首$匹配行尾行尾如表达式:.abc$与 7853abc2pu 相匹配?匹配特定字符串,用(,)将要匹配不同字符串分开,用(-)表示匹配字符串的范围。例如A-Z,a-z,0-9 匹配任意的字母和数字?*可匹配单字符0次或多次。与表达式Des*k匹配有Desk Dessk Desssk?次数匹配?表达式n ;匹配模式出现n次?表达式n,;匹配模式出现至少n次?表达式n,m ;匹配模式出现次数在n与m之间3.1.4 正则表达式

23、之三正则表达式之三?使用 来屏蔽特殊字符*表示普通字符*?使用.来匹配任意单字符?常用正则表达式$匹配空行.*$匹配行中任意字符.匹配带句点的行.*匹配只有一个字符的行3.1.5 程序编辑器程序编辑器?编辑器是系统的重要工具之一,在各种操作系统中,编辑器都是必不可少的部件。Linux系统提供了一个完整的编辑器家族系列,如Ed、Ex、Vi和Emacs等,按功能它们可以分为两大类。行编辑器(如Ed、Ex)全屏幕编辑器(如Vi、Emacs、geidt)?Vi有3种基本工作模式:指令行模式、文本输入模式、末行模式,它们的相互关系如下。3.2 Makefile?3.2.1 GNU make?GNU ma

24、ke最初是Unix系统下的一个工具,设计之初是为了维护C程序文件不必要的重新编译,它是一个自动生成和维护目标程序的工具。?make是一个解释Makefile文件中指令的命令工具,其最基本的功能就是通过Makefile文件来描述源程序之间的相互关系并自动维护编译工作,它会告知系统以何种方式编译和链接程序。?完成Makefile文件配置后,可通过在Linux终端输入make命令,完成所有编译,生成目标程序。Make 工作流程工作流程通常状况之下GNU make的工作流程如下。查找当前目录下的Makefile文件 初始化文件中的变量 分析Makefile中的所有规则 为所有的目标文件创建依赖关系 根

25、据依赖关系,决定哪些目标文件要重新生成 执行生成命令Make实例之一实例之一main.ctest1.ctest2.cmain.otest1.otest2.otest程序依赖关系树Make实例之二实例之二?通常,可编写如下Shell脚本make.shell:gcc -c test1.c;编译test1.c生成test1.ogcc -c test2.c ;编译test2.c生成test2.ogcc -c main.c ;编译main.c生成main.ogcc -o test test1.o test2.o main.o ;由以上三个目标文件链接成一个源文件?存盘退出,用以下命令将其变成可执行文件:

26、#chmod+x make.shell#./make.shell?可在当前目录下生成可执行文件:testMake实例之三实例之三?上述Shell脚本编译存在以下问题:?编译步骤烦琐:每个源文件生成目标文件需要gcc?无法智能编译:源文件不管是否修改,均需编译?无法用于复杂工程:对于多子目录,多源文件的编译和链接,非常困难。?通过Makefile,说明如何编译源文件并链接生成可执行文件,并定义源文件之间的依赖关系。?重新编译时,只编译修改的源文件,和依赖该文件的其他文件Make实例之四:实例之四:Makefile文件内容文件内容test:main.o test1.o test2.ogcc-o t

27、est test1.o test2.o main.o#行首空一test1.o:test1.c#依赖关系gcc -c test1.c#编译语句test2.o:test2.cgcc -c test2.cmain.o:main.cgcc -c main.cinstall:#拷贝安装可执行文件cp test /home/tmpclean:#清除make产生的目标文件rm -f *.oMake实例之五:优点实例之五:优点?Makefile优点如下:?智能编译:只编译修改的源文件,和依赖该文件的其他文件?适用于复杂工程:若有多子目录和多源文件,可在每个子目录下编写Makefile文件,再通过顶层的Make

28、file文件递归调用子目录的Makefile文件,完成所有文件的编译。Make 命令执行命令执行?在Makefile所在目录输入make指令,如下make 选项 宏定义 目标文件选项 -f:指定除Makefile以外其他文件名作为makefile文件名;-n:打印出所有执行命令。-C dir:执行dir目录下的Makefile文件。?参数目标文件是Makefile文件中定义的目标文件。若参数目标文件省略,make将生成Makefile文件中定义的第一个目标文件。否则将生成该参数所标识的目标文件。如上例中:#make main.o;生成目标文件main.o#make install ;生成目标文

29、件install3.2.2 Makefile基本结构基本结构?Makefile有其自身特定的编写格式并且遵循一定的语法规则。?一、规则格式#注释目标文件:依赖文件列表命令.二、二、Makefile文件特点文件特点?注释:采用#开头。?目标文件:编译过程生成的目标文件(*.o)或最终可执行文件,也可是要执行的动作,如”clean”?目标文件可以是一个或多个,可使用通配符。?依赖文件:目标文件生成所依赖文件。?命令:make程序执行的动作,也是创建目标文件的动作,可有多个,但每行一个,以开头?命令太长,可使用()作为换行符。?目标文件和(:)号不能省略,依赖文件和命令可省?依赖文件可使用通配符号,

30、如*.c。二、MakeFile规则?MakeFile显示规则?指定变量?隐含规则?清空目标文件的规则?模式规则?伪目标?标准目标?特殊目标?命令错误?通配符1.MakeFile显示规则?Makefile的基本结构由描述规则组成,规则负责描述在何种情况下如何重建目标文件,通常规则中包括了目标的依赖关系和重建目标的命令。一个简单的Makefile描述规则如下:target.:mand.MakeFile显示规则(续)?target称为规则的目标,通常是最后需要生成的文件名,或是为了实现这个目的而必须的中间过程文件名。另外,目标也可以是一个make需要执行的动作的名称,如目标“clean”,称这样的目

31、标是“伪目标”。伪目标一般不会被自动执行,而必须通过命令行指定伪目标名才能执行,例如“make clean”.MakeFile显示规则(续)?prerequistes称为规则的依赖文件,是生成规则目标所需要的文件名列表。通常是一个目标依赖于一个或者多个文件。?command称为规则命令行,这是规则所要执行的动作,可以是任意的shell命令或者可以在shell下执行的程序,它限定make执行这条规则时执行的操作。edit:main.o kbd.o command.o display.o insert.o search.o files.o utils.ogcc-o edit main.o kbd.

32、o command.o display.o insert.o search.o files.o utils.omain.o:main.c defs.hgcc-c main.ckbd.o:kbd.c defs.h command.hgcc-c kbd.ccommand.o:command.c defs.h command.hgcc-c command.cdisplay.o:display.c defs.h buffer.hgcc-c display.cinsert.o:insert.c defs.h buffer.hgcc-c insert.csearch.o:search.c defs.h b

33、uffer.hgcc-c search.cfiles.o:files.c defs.h buffer.h command.hgcc-c files.cutils.o:utils.c defs.hgcc-c utils.cclean:rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o例例 4-7:makefile实例实例例:makefile实例edit:main.o kbd.o command.o display.o insert.o search.o files.o utils.ogcc-o ed

34、it main.o kbd.o command.o display.o insert.o search.o files.o utils.omain.o:main.c defs.hgcc-c main.ckbd.o:kbd.c defs.h command.hgcc-c kbd.ccommand.o:command.c defs.h command.hgcc-c command.cdisplay.o:display.c defs.h buffer.hgcc-c display.cinsert.o:insert.c defs.h buffer.hgcc-c insert.csearch.o:sea

35、rch.c defs.h buffer.hgcc-c search.cfiles.o:files.c defs.h buffer.h command.hgcc-c files.cutils.o:utils.c defs.hgcc-c utils.cclean:rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o连接符连接符目标文件目标文件依赖文件依赖文件生成规则生成规则makefile结构分析结构分析总结?对于一个Makefile文件,make首先解析默认目标所在的规则,根据依赖文件(例子中第一个规

36、则的8个.o文件)依次寻找创建这些依赖文件的规则。?创建或者更新每一个规则依赖文件的过程都是这样的一个过程。?更新默认目标的过程中,如果任何一个规则执行出现错误make就立即报错并退出。2.指定变量edit:main.o kbd.o command.o display.o insert.o search.o files.o utils.ogcc-o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.oobjects=main.o kbd.o command.o display.o insert.o sea

37、rch.o files.o utils.o2。在makefile中使用变量edit:main.o kbd.o command.o display.o insert.o search.o files.o utils.ogcc-o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.oobjects=main.o kbd.o command.o display.o insert.o search.o files.o utils.oobjects=main.o kbd.o command.o display.o

38、insert.o search.o files.o utils.oedit:$(objects)gcc-o edit$(objects)main.o:main.c defs.hgcc-c main.ckbd.o:kbd.c defs.h command.hgcc-c kbd.ccommand.o:command.c defs.h command.hgcc-c command.cdisplay.o:display.c defs.h buffer.hgcc-c display.cinsert.o:insert.c defs.h buffer.hgcc-c insert.csearch.o:sear

39、ch.c defs.h buffer.hgcc-c search.cfiles.o:files.c defs.h buffer.h command.hgcc-c files.cutils.o:utils.c defs.hgcc-c utils.cclean:rm edit$(objects)3.隐含规则?什么是隐含规则一些经常使用而且使用频率很高的,事先已经约定好,不需显式书写出的规则。隐含规则是一种惯例,make会按照这种“惯例”心照不宣的运行。隐含规则(续)objects=main.o kbd.o command.o display.o insert.o search.o files.o

40、utils.oedit:$(objects)gcc-o edit$(objects)main.o:defs.hkbd.o:defs.h command.hcommand.o:defs.h command.hdisplay.o:defs.h buffer.hinsert.o:defs.h buffer.hsearch.o:defs.h buffer.hfiles.o:defs.h buffer.h command.hutils.o:defs.h.PHONY:cleanclean:rm edit$(objects)隐含规则隐含规则隐含规则(续)objects=main.o kbd.o comman

41、d.o display.o insert.o search.o files.o utils.oedit:$(objects)gcc-o edit$(objects)main.o:defs.hkbd.o:defs.h command.hcommand.o:defs.h command.hdisplay.o:defs.h buffer.hinsert.o:defs.h buffer.hsearch.o:defs.h buffer.hfiles.o:defs.h buffer.h command.hutils.o:defs.h.PHONY:cleanclean:rm edit$(objects)隐含

42、规则隐含规则显式指明显式指明clean是个伪目标文件是个伪目标文件隐含规则(续)objects=main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit:$(objects)gcc-o edit$(objects)$(objects):defs.hkbd.o command.o files.o:command.hdisplay.o insert.o search.o files.o:buffer.h.PHONY:cleanclean:rm edit$(objects)4.清空目标文件的规则每个makefile文

43、件都应有一个“清空目标文件”的规则:?.PHONY表示clean是一个伪目标?减号“-”的作用是一旦出现问题,可以继续执行后面的操作?clean不能放在文件头,习惯上放在文件尾clean:rm edit$(objects).PHONY:cleanclean:-rm edit$(objects)5.模式规则?在模式规则中,目标名中需要包含有一个模式字符“%”,包含有模式字符的目标被用来匹配一个文件名。一个模式规则的格式为:%.o:%.c:指定了如何由文件“N.c”来创建文件“N.o”,文件“N.c”必须是已经存在或者可被创建的;6.伪目标?伪目标一般来说:没有依赖关系,不能直接执行伪目标不能与文

44、件名重名显式指明伪目标:.PHONY?也可为伪目标指定依赖关系,用于同时生成多个可执行文件。2 Makefile中的伪目标中的伪目标?伪目标不是文件,而是一个完成特定任务的标签,如上例中的”install”和”clean”?.PHONY对伪目标显示定义。例如:.PHONY:cleanclean:rm-f *.o;删除所有的目标文件.?make无法生成伪目标的依赖关系并决定其是否执行,因此,必须手工执行,格式如下:make clean?伪目标install将编译完成的执行文件复制到安装目录同时生成多个可执行文件.PHONY:allall:p1 p2 p3p1:p1.cgcc p1.c-o p1p

45、2:p2.cgcc p2.c-o p2p3:p3.cgcc p3.c-o p3#include /p1.cmain()printf(this is p1.n);7.标准目标?Makefile标准目标是一些约定俗成的目标,它们代表一个确定的含义,包含:all:编译所有的伪目标;clean:删除所有被make创建的文件;install:安装已编译好的程序;print:列出改变过的源文件;tar:打包备份源程序;dist:创建一个压缩文件;TAGS:更新所有的目标;8.特殊目标?GNU make所支持的特殊目标有:.PHONY:它的所有依赖被视为伪目标。伪目标所在规则定义的命令会被无条件执行。.PR

46、ECIOUS:它的所有依赖文件在make过程中会被特殊处理。.DELETE_ON_ERROR:规则的命令执行错误,它将删除已经被修改的目标文件。.SILENT:指定命令行没有意义,这是旧版中的用法。当前用法是使用make命令行参数“-s”或者“-silent”9.命令错误?make运行时,make会检测每个命令的执行的返回码,如果命令返回成功,make会执行下一条命令,否则make终止。?-:在makefile的命令行前加一个减号,此时不管命令是否出错,都认为是成功的。10.通配符?make支持2种通配符*?通配符可在规则命令中使用,它是在命令被执行时由shell进行处理。例如:clean:r

47、m-f*.o3.2.3 Makefile文件中变量的使用文件中变量的使用1自定义变量定义格式自定义变量定义格式变量名=变量值或变量名:=变量值2自定义变量使用方法:自定义变量使用方法:$(变量名)例如:OBJ=main.o test1.o test2.oCC=gcc#定义编译器的宏test:$(OBJ)$(CC)o test$(OBJ)3特殊内部变量特殊内部变量$当前规则的目标文件列表$依赖文件列表的第一个依赖文件$依赖文件列表的所有依赖文件,空格分隔$?新于目标文件的所有依赖文件列表$*不含扩展名的目标文件名称。4环境变量环境变量还可使用Shell环境变量5Makefile文件中变量应用文件

48、中变量应用1)代表一个文件列表代表一个文件列表Makefile文件中的变量常常存储一些目标文件甚至是目标文件的依赖文件,引用这些文件的时候引用存储这些文件的变量即可,这给Makefile编写和维护者带来了很大的方便2)代表编译命令选项代表编译命令选项所有编译命令都带有相同编译选项时(比如-Wall-O2等),可以将该编译选项赋给一个变量,这样方便了引用。同时,如果改变编译选项的时候,只需改变该变量值即可,而不必在每处用到编译选项的地方都做改动。3.3 二进制代码工具的使用二进制代码工具的使用3.3.1 GNU Binutils工具介绍工具介绍在Linux下建立嵌入式交叉编译环境要用到一系列的工

49、具链(tool-chain),主要有比如GNU Binutils、Gcc、Glibc、Gdb等,它们都属于GNU的工具集。GNU Binutils工具集里主要有以下一系列的部件。as GNU汇编器:汇编语言转成二进制代码 ld GNU链接器:将多个目标文件链接成执行文件 add2line 将地址转换成文件名或行号对,以便调试程序 ar 从文件中创建、修改、扩展文件gasp 汇编宏处理器 nm 从目标代码文件中列举所有变量(包括变量值和变量类型),如果没有指定目标文件,则默认是a.out文件 objcopy objcopy工具使用GNU BSD库,它可以把目标文件的内容从一种文件格式复制到另一种

50、格式的目标文件中 add2line 把程序地址转换为文件名和行号 objdump 显示目标文件信息 readelf 显示elf文件信息 ranlib 生成索引以加快对归档文件的访问,并将其保存到这个归档文件中 size 列出目标模块或文件的代码尺寸 strings 打印可打印的目标代码字符(至少4个字符),打印字符多少可以控制 strip 放弃所有符号连接 c+filt 链接器ld使用该命令可以过滤C+符号和Java符号,防止重载函数冲突 gprof 显示程序调用段的各种数据3.3.2 Binutils工具软件使用工具软件使用1汇编器汇编器Linux平台的标准汇编器是GAS,它是GCC所依赖的

51、后台汇编工具,通常包含在binutils 软件包中。#as -o test.o test.s;将汇编程序test.s编译成二进制目标文件test.o2链接器链接器GNU链接器使用一个命令语言脚本来控制链接过程.编译后的目标文件需经过链接才能生成执行文件#ld -s -o test test.o3.4 gcc编译器?GCC简介?gcc的基本用法?警告提示功能?代码优化?常用选项一、GCC简介GCC是GNU项目的编译器组件之一。GCC发展大体经历了下面几个阶段 1987年,第一版的GCC发布。2001.6.18,GCC3.0正式发布。2005.4.22,最新版GCC 4.0发布,网站:http:/

52、gcc.gnu.org目前最新版:GCC4.3.2GCC是一组编译工具的总称,其软件包里包含众多工具,按其类型,主要有以下的分类。C编译器 cc,cc1,cc1plus,gcc C+编译器 c+,cc1plus,g+源码预处理程序 cpp,cpp0 库文件 libgcc.a,libgcc_eh.a,libgcc_s.so,libiberty.a,libstdc+.a,so,libsupc+.aA.GCC简介?GCC:GNU Compiler Collection?能够编译c、c+、Object C,通过前端模块扩展还可支持java、fortran、pascal、ada、modula-3等。?提

53、供了30多条警告信息和3个警告级别?gcc与g+A.GCC简介?GCC:GNU Compiler Collection?能够编译c、c+、Object C,通过前端模块扩展还可支持java、fortran、pascal、ada、modula-3等。?提供了30多条警告信息和3个警告级别?gcc与g+gcc和和g+的区别在于的区别在于:当你的程序中出现当你的程序中出现using namespace std等带有等带有C+特性的语句时,如果用特性的语句时,如果用gcc编译,必须显式指明这个程序要用编译,必须显式指明这个程序要用C+标准库编译。而标准库编译。而g+可以直接编译可以直接编译B.gcc支

54、持的文件存档文件.a目标文件.o头文件.h汇编语言源程序.S汇编语言源程序.s经过预处理的C+源程序.ii经过预处理的C源程序.iObject C源程序.mC+源程序.cxxC+源程序.ccC+源程序.CC源程序.c所支持的文件后缀名C.gcc是高效的编译器#include main()printf(hello worldn);g+编译后编译后4.6ktc+3编译后编译后 7.8k bc45编译后编译后53.8k vc6编译后编译后184kD.编译过程?GCC由源程序生成可执行程序过程分为四阶段:预处理 编译 汇编 链接?程序员可以根据需要在任何一阶段停止二、gcc的基本用法?语法格式:gcc

55、 option filenamesoption为编译器所需要的选项,filenames为相关文件名称?举例(单文件)gcc-o hello hello.c把hello.c文件编译为hello二、gcc的基本用法(续)?举例(多文件)gcc m1.c m2.c-o hello把源文件m1.c和m2.c编译链接为可执行文件helloA.gcc常用选项?-o output_filename:输出文件名称为output_filename注意:这个名称不能和源文件同名,否则就会替换掉源文件。如果不给出这个选项,gcc默认输出文件为a.outA.gcc常用选项(续)?-g:在可执行文件中包含符号调试工具所

56、必须得调试信息?-I dirname:将dirname所代表的目录加入到程序头文件目录列表中A.gcc常用选项(续)?-L dirname:将dirname所代表的目录加入到程序库文件目录列表中?-l libname:指定目标文件链接时需要的库文件名?-v:查看gcc版本号B.gcc工作过程?分四个阶段gcc调用预处理程序cpp进行预处理,负责展开宏、插入头文件等;gcc调用ccl,把预处理后的文件翻译成汇编;gcc调用as,把汇编程序汇编为目标文件;gcc调用链接程序ld,把目标代码链接为可执行文件。B.gcc工作过程(续)?分步编译源程序gcc E hello.c o hello.i/预处

57、理文件gcc S hello.c o hello.s/汇编文件gcc c hello.c o hello.o/目标文件gcc hello.c o hello /可执行文件/exp/gcc/hello.c三、警告提示功能?gcc包含完整的出错检查和警告提示功能,可以帮助程序员尽快找到错误的代码。?gcc包含30多个警告和3个警告级别。三、警告提示功能(续)?-Wall:可以显示尽可能多的警告?-Werror可以警告当前错误,并停止编译?-w禁止所有的警告【例4-1】?/*ch4_1.c*/#include void main(void)long long a=1;printf(there are

58、 three warnings!n);用gcc-Wall编译时ch4_1.c:4:warning:return type of main is not intch4_1.c:in function main:ch4_1.c:5:warning:unused varibale ach4_1.c:7:2:warning:no newline at end of file三、警告提示功能(续)作用选 项 名把所有警告转变为错误-Werror使用了long long类型则警告-Wlong-long如果定义了全局函数但却没有在任何头文件中声明则警告-Wmissing-declarations函数不能被内

59、联则警告-Winline如果在#if宏中使用了未定义的变量做判断则警告-Wundef使用的自动变量没有初始化则警告-Wuninitialized变量声明了但未使用,或static类型函数未被调用则警告-Wunused若switch中少了一个或多个case分支(仅对enum适用)则警告-Wswitch根据上下文推断,如果把(n=10)写作(n=10)则警告-Wparentheses如果main的返回类型不是int或者调用main时参数不正确则警告-Wmain如果传递给printf的参数与制定格式不匹配则警告-Wformat如果出现注释嵌套则警告(/*后又出现/*)-Wcomment四、gcc代码

60、优化?代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。?gcc代码优化采用“-On”选项-O 0:对程序的编译、链接不进行优化-O/-O1:同时减小代码的长度和执行时间/默认值-O2:包括-O的功能,以及指令调度等调整工作-O3:包括-O2的功能,以及循环展开等工作【例4-2】/*ch4_2.c*/#include int main()double i;double t;double m;for(i=0;i5000.1*5000.1*5000.1/19.1+1930.5;i+=(6-4+3+1)/3.9)m=i/2000.1;t=

61、i+2.3;return 0;/exp/gcc/optimeze.c?分别使用以下选项编译程序。?运行程序,找到运行时间【例4-2】(续)gcc O2 ch4_2.c-o a1gcc O ch4_2.c-o a2time./a1/1分分19秒秒time./a2/11秒秒代码优化的缺点(续)?代码优化的缺点优化等级越高,编译的时间越长资源受限时,优化可能会导致程序不可用,如嵌入式设备中优化使跟踪调试变得困难五、gcc常用选项作用选 项 名显示编译各阶段工作需要的详细的时间-Q保留可执行文件编译过程中的临时文件-save-temps采用管道技术,加快程序编译-pipe尽可能显示ANSI/ISO C

62、标准列出的所有错误-pedantic-error可找到不符合ANSI/ISO标准的语句(并非全部)-pedantic支持ANSI/ISO语法标准,取消gnu与所有与其冲突的语法-ANSI对库文件进行静态链接-static定义指定的宏,使它能够通过源码中的ifdef 进行检验-Dmacro3.5 ld链接器?ld链接器概述?链接描述文件简介一、ld链接器概述?ld链接器:把各种目标文件和库文件链接在一起,形成可执行文件。source filesource filesource fileassemblerassemblerassemblerobject fileobject fileobject

63、filelinkerexecutablefileprogram library输入文件输出文件输入文件输出文件A.可执行文件结构示意图textdatabsstextdatabsstextdatabsstextdatabssABC?目标文件由段组成data段:保存有初值的全局变量。text段:保存代码bss段:保存无初值的全局变量。B.ld链接器的主要工作内容?Two pass设计流程扫描所有输入文件,包括目标文件和函数库,统计各段需要的总空间大小,并安排各段在可执行文件中的先后顺序,建立临时的符号表重新扫描,建立最终符号表,组合各段,链接生成可执行程序?重点是重新计算各段、标志符号的位置。C.

64、ld工作方式?工作方式:gcc等编译器内置有缺省的连接脚本。若采用缺省脚本,则生成的目标代码需要操作系统才能加载运行ld程序识别链接描述文件(Linker Script)来显式的控制链接的过程。?链接描述文件:描述了各个输入文件的各段如何映射到输出文件的各段中,并控制输出文件各段布局?链接命令语言(Linker Command Language):用来编写链接描述文件。【例】gcc c hello.c o hello.old-dynamic-linker/lib/ld-linux.so.2/usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o hello

65、.o-lc-o myhello/exp/vmlinux/hello.cld hello.o-o myhello下面的写法错误下面写法正确可见自己执行下面的写法错误下面写法正确可见自己执行ld命令的过程是很繁琐的命令的过程是很繁琐的D.ld链接器选项?-EB:定义大端模式?-EL:定义小端模式?-l LIBNAME:要链接的库文件?-L DIRECTORY:搜索库文件时的路径?-o FILE:输出文件名?-O LEVEL:优化级别?-T FILE:读链接描述文件名?-e:设置执行程序入口点二、链接描述文件介绍?链接脚本文件支持命令操作,支持简单的数学运算,支持对目标机存储系统的定义,以及负责实际

66、内存在目标机上的映射。A.链接描述文件举例1?输出文件段描述的格式如下:SETCTION.=0 x2000000;.text:*(.text).=0 x5000000;.data:*(.data).bss:*(.bss)/符号赋值命令符号赋值命令/输出文件段描述输出文件段描述A.链接描述文件举例1(续)?.代表的含义是当前的位置。这段代码表示在地址0 x2000000处放置程序的代码段,此代码段是由各模块的代码段合并而成,在地址为0 x500000处放置数据段,接下来放置未初始化的数据段。B.链接描述文件的命令?简单赋值语句(符合赋值语句):symbol=expression;symbol+=expression;symbol-=expression;symbol*=expression;symbol/=expression;symbol=expression;symbol&=expression;symbol!=expression;C.链接描述文件举例2SECTIONSROM_BASE=0 x00000000;.=0 x0C000000;/设置当前地址设置当前地址Image_RO_

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!