欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    基于ARM9和Linux嵌入式系统设计.ppt

    • 资源ID:5951667       资源大小:323KB        全文页数:127页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于ARM9和Linux嵌入式系统设计.ppt

    第6章 基于ARM9和Linux嵌入式系统设计,6.1 嵌入式Linux的开发环境6.2 嵌入式Linux操作系统常用命令6.3 Linux开发工具GUN gcc的使用6.4 GNU make命令和makefile 文件6.5 GDB调试器简介6.6 嵌入式Linux下C语言编程 文件的操作6.7 嵌入式Linux引导程序6.8 Linux系统在ARM平台上的移植6.9 综合训练Linux系统及应用程序的烧,6.1 嵌入式Linux的开发环境,6.1.1 嵌入式Linux开发环境建立嵌入式LINUX 开发环境有几个方案:1、基于PC 机WINDOWS 操作系统下的CYGWIN;2、在WINDOWS 下安装虚拟机后,再在虚拟机中安 装LINXUX 操作系统;3、直接安装LINUX 操作系统。,6.1.2 嵌入式Linux开发的一般过程,1.了解硬件;2.准备需要使用的Linux工具以及其他工具;3.安排内存地址;4.编写启动代码和机器相关代码;5.编写驱动程序;6.C库、GUI和系统程序的移植;7.调试.,6.2 嵌入式Linux操作系统常用命令,命令形式如下:command option source file(s)target file 1登录和退出Linux启动后,给出login命令,等待用户登录。Login:Password:使用logout命令退出外壳。2关机或重新启动的shutdown命令$shutdown h now 要求系统立即关机$shutdown now 要求系统立即关机$shutdown+5 要求5分钟后关机$shutdown r now 要求立即关机系统并重新启动,3联机帮助(1)显示帮助手册man 选项命令名称常用选项 说明-S根据章节显示,由于一个命令名称可能会有很多类别;-f只显示出命令的功能而不显示其中详细的说明文件;-w不显示手册页,只显示将被格式化和显示的文件所在位置;-a显示所有的手册页,而不是只显示第一个;-E在每行的末尾显示$符号。例如:要了解关于这个命令的更多信息,可以使用:$man echo,(2)系统帮助文档help命令用于查看所有Shell命令。用户可以通过该命令寻求Shell命令的用法,只需在所查找的命令后输入help命令,就可以看到所查命令的内容了。例如:查看cd命令的使用方法。$cd-help,(3)whereis命令whereis命令来查询某个命令存在哪一个目录下。命令格式:whereis 选项 命令名。说明:不加选项可直接使用whereis命令。whereis命令的常用选项如下:章节说明-b只查找二进制文件-m查找主要文件-s查找来源-u查找不常用的记录文件例如:查找cd命令二进制文件在什么目录下。命令:$whereis-b cd,4更改账号密码使用passwd命令来设置新用户的口令。在设置口令之后,账号即能正常工作。语法:passwdOld password:New password:Retype new password:,5列出文件或目录ls 选项 文件目录列表 ls命令中的常用选项如下:-a:显示所有文件及目录,包括以“.”开始的隐藏文件在内的所有文件名;-c:按列输出,纵向排序;-x:按列输出,横向排序;-l:列出目录下文件权限、所有者、文件大小、修改时间及名称;lg 同上,并显示出文件的所有者工作组名;-t:根据文件建立时间的先后次序列出;-A:同-a,但不列出.(目前目录)及.(父目录);-R:递归显示下层子目录即显示出目录下以及所有子目录文件名;-help:显示帮助信息;-version:显示版本信息。,6改变工作目录语法:cd name其中name是目录名、路径或目录缩写。cd除了有切换目录的功能外,还有一个功能就是,不管在哪个目录内,只要输入cd命令,不加任何参数,即可回到用户目录内。$cd tony 切换到当前目录下的tony子目录$cd.切换到上一层目录$cd/切换到系统根目录$cd 切换到用户主目录(或运行cd 命令也可以)$cd/usr/bin 切换到/usr/bin目录,7.建立新目录 mkdir的命令格式如下:mkdir-m模式-p目录名 目录命令中的参数说明如下:m模式:在建立目录时把按模式指定设置目录权限。该目录的权限分为:目录所有者的权限、组中其他人对目录的权限和系统中其他人对目录的权限。这三个权限分别用三个数字之和来表示:对目录的读权限是4、写权限是2、执行权限是1。-p目录名:建立所有不存在父目录的目录。目录:要建立的目录。,8删除文件或目录rm 选项 文件列表常用选项 说 明-r 删除文件列表中指定的目录,若不用此标志则不删除目录-I 指定交互模式。在执行删除前提示确认。任何以Y开始的响应都表示肯定;其他则表示否定。-f 指定强行删除模式。本标志强迫删除,不用提示。-V 在删除前回显文件名。-指明所有选项结束。用于删除一个文件名与某一选项相同的文件。例如:假定偶然建立了名为-f的文件,又打算删除它,命令rm-f不起任何作用,因为-f被解释成标志而不是文件名;而命令rm-f能成功地删除文件。,9删除目录的rmdir命令rmdir 命令是用来删除目录的,一般情况下要删除的目录必须为空目录,如果所给的目录不为空,系统会报告错误。该命令的语法格式如下:rmdir-p 目录列表命令中的参数说明如下:-p:在删除目录表指定的目录后,若父目录为空,则rmdir也删除父目录。状态信息显示什么被删除,什么没被删除。目录列表:空格分隔的目录名列表。要删除的目录必须为空。,10显示当前目录执行pwd命令形式如下:pwd11改变当前工作目录该命令使用的语法格式如下:Cd 目录名命令中的参数说明如下:目录名:改变到所指定的目录名。若没有指定目录,就返回到用户主目录(在HOME环境变量中指定)。,12复制文件的cp命令Cp 选项 源文件 目标文件Cp 选项 源文件组 目标目录 源文件:要拷贝的文件。目标文件:目标名。也可以是目录名,这种情况下,源文件名作为目标文件名,而文件放在该目录下。源文件组:要拷贝文件的由空格分隔的列表。目标目录:目标目录。常用命令的选项如下:常用选项 说 明-a 在备份中保持尽可能多的源文件结构和属。-b 将要覆盖或删除文件的备份。-f 删除已存在的目标文件。-I 提示是否覆盖已存在的目标文件。-p 保持原先文件的所有者、组权限和时间标志-r 递归拷贝目录,把所有非目录文件当普通文件拷贝。-R 递归拷贝目录。,13.移动或更改文件、目录名称mv-f-i 文件1 文件2mv-f-i 目录1 目录2mv-f-i 文件列表 目录命令中的参数说明如下:-f:通常情况下,目标文件存在但用户没有写权限时,mv会给出提示。本选项会使mv命令执行移动而不给出提示。-i:交互模式,当移动的目录已存在同名的目标文件名时,用覆盖方式写文件,但在写入之前给出提示。文件1:源文件名。文件2:目标文件名(新文件名)。目录1:源目录名。目录2:目标目录名(新目录名)。文件列表:用空格分隔的文件名列表。把列表中的文件移动到一个新目录。目录:目标目录。,14分页查看文件内容 用户可以使用more命令,让画面显示满一页时暂停,此时可按空格键继续显示下一个画面,或按Q键停止显示。其命令格式如下:more 文件名 显示文字文件的内容;或cat文件名|more 逐页显示文字文件的内容;或ls al|more 显示满一个画面便停止,按空格键继续显示下一画面,按Q键跳离。,15查看文件内容 显示文本文件内容的命令是cat命令,用来将文件的内容显示到终端上,其命令语法如下:cat 选项 文件列表命令中的参数说明如下:-b 计算所有非空输出行,开始为1。-e 在每行末尾显示$符号。-n 计算所有输出行,开始为1。-s 将相连的多个空行用单一空行代替。,16.查找文件内容grep 选项 匹配字符串 文件列表文件列表:需查找的文件列表 匹配字符串:希望在文件中查到的串。选项:说明-v 列出不匹配串或正则表达式的行。-c 对匹配的行计数。-l 只显示包含匹配的文件的文件名。-h 抑制包含匹配文件的文件名的显示。-n 每个匹配行只按照相对的行号显示。-i 产生不区分大小写的匹配,缺省状态是区分大小写。,17排序命令命令的语法格式如下:sort 选项 文件 说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用“-”,则表示排序内容来自标准输入。,18.比较文件内容的命令(1)comm命令如果想对两个有序的文件进行比较,可以使用comm命令。该命令的使用语法如下:comm-123 file1 file2 说明:该命令是对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件。comm读取这两个文件,然后生成三列输出:仅在file1中出现的行;仅在file2中出现的行;在两个文件中都存在的行。如果文件名用“-”,则表示从标准输入读取。,(2)diff命令diff命令用于比较两个文件内容的不同,其命令语法格式如下:diff 参数原文件目标文件 参数 说明a 将所有文件当做文本文件来处理 b 忽略空格造成的不同 B 忽略空行造成的不同q 只报告什么地方不同,不报告具体的不同信息H 利用试探法加速对大文件的搜索I 忽略大小写的变化L 用pr对输出进行分页R 在比较目录时比较所有的子目录S 两个文件相同时才报告v 在标准输出上输出版本信息并退出,19.命令的输入和输出(1)输入重定向 输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。重定向操作符使用“文件名 可以使用追加重定向操作符“”,其使用语法形式为:命令文件名,(3)管道 管道是把一系列命令连接起来,即第一个命令的输出会作为第二个命令的输入通过管道传给第二个命令,第二个命令的输出又会作为第三个命令的输入,以此类推。显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中未使用输出重定向)。(4)命令替换 命令替换和重定向有些相似,但区别在于命令替换是将一个命令的输出作为另外一个命令的参数。常用命令格式为:command1 command2 其中,command2的输出将作为command1的参数。需要注意的是这里的符号,被它括起来的内容将作为命令执行,执行后的结果作为command1的参数。,例如:$cd pwd 该命令将pwd命令列出的目录作为cd命令的参数,结果仍然是停留在当前目录下。重导与管道举例:$ls al dir.txt 将ls al命令执行结果输出到dir.txt文件;$cat data1.txt data2.txt 将data1.txt内容附加到data2.txt 文件之后;$ls|grep conf 搜索并显示ls命令运行结果中含有“conf”字符串的行;$yes|rm r mydir 利用yes命令重复输出“y”字符的特性,将结果传给rm命令,如此即可避免重复输入“y”。,20.链接文件的命令ln 选项 目标 链接名ln 选项 目标 目录链接有两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。建立硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接。而对符号链接,则不存在这个问题。默认情况下,ln产生硬链接。例:$ln-s lunch/home/xu 用户为当前目录下的文件lunch创建了一个符号链接/home/xu。,21.改变文件或目录权限chmod选项文件和目录列表chmod命令的常用选项如下:-c表示只有在文件的权限确实改变时才进行详细说明;-v表示详细说明权限的变化;-R表示递归改变目录及其内容的权限。chmod命令支持两种文件权限设定的方法:(1)使用字符串设置权限;(2)使用八进制数设置权限另外,文件和目录的权限还可用八进制数字模式来表示。三个八进制数字分别代表ugo的权限。执行权、读权和写权所对应的数值分别是1,2和4。若要rwx属性则4+2+1=7;若要rw-属性则4+2=6;若要r-x属性则4+1=5。,22改变文件和目录的所有权chown选项 用户文件和目录列表用户:是用户号或文件/etc/passwd中出现的用户名。文件和目录列表:用于重新指定所有权的用空格分隔的文件和目录列表。chown命令的常用选项如下:常用选项 说 明-c 只有在文件的权限确实改变时才进行详细说明。-v 详细说明权限的变化。-R 递归改变目录及其内容的权限。,23文件压缩(1)gzip压缩文件gzip 选项 压缩(解压缩)的文件名gzip命令各选项的说明如下:常用选项 说明-c 将输出写到标准输出上,并保留原有文件。-d 将压缩文件解压。-l 对每个压缩文件,显示压缩文件的大小、未压缩文件的大小、压缩比、未压缩文件的名字等详细信息-r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。-t 测试,检查压缩文件是否完整。-v 对每一个压缩和解压的文件,显示文件名和压缩比。,(2)文件打包tartar 主选项+辅选项 文件或者目录 常用选项 说明-c 创建新的档案文件。备份一个目录或是一些文件。-x 从档案文件中释放文件。-r 把要存档的文件追加到档案文件的未尾。-t 列出档案文件的内容,查看已经备份了哪些文件。tar命令的辅助选项的常用选项如下:F 使用档案文件或设备,这个选项通常是必选的。K 保存已经存在文件。在还原时,遇到相同文件,不进行覆盖。M 在还原文件时,把所有文件的修改时间设定为现在。V 报告tar处理的文件信息。如无此选项,tar不报告文件信息。Z 用gzip来压缩/解压缩文件,(3)unzip命令unzip命令用于解扩展名为“.zip”的压缩文件。命令格式如下:unzip 选项 压缩文件名.zipupzip命令的常用选项如下:-x 文件列表 解压缩文件,但不包括指定的file文件-v 查看压缩文件目录,但不解压。-t 测试文件有无损坏,但不解压。-d 目录把压缩文件解到指定目录下。-z 只显示压缩文件的注解。-n 不覆盖已经存在的文件。-o 覆盖已存在的文件且不要求用户确认。-j 不重建文档的目录结构,把所有文件解压到同一目录下。,24加载的mount命令(1)加载光盘rootfree root#mount/dev/cdrom/mnt/cdrom1 若要显示中文,可执行以下命令:rootfree root#mount o iocharset=cp936/dev/cdrom/mnt/cdrom1其中:“o iocharset=cp936”是显示中文的参数。(2)加载硬盘可以加载硬盘分区、ZIP磁盘驱动器等。例如/dev/hda1(IDE0第1个硬盘的第1个主分区)是采用Windows的FAT32文件系统,可执行以下命令加载:rootfree root#mount t vfat/dev/hda1/mnt/winC若要显示中文,可以执行以下命令:rootfree root#mount t vfat o iocharset=cp936/dev/hda1/mnt/winC,(3)加载U盘或USB设备与光盘一样,存取U盘前,必须先将其加载到系统中。只不过,Linux会将USB视为SCSI装置,其设备名称为/dev/sd?(?代表az,若您的系统中只有这一项SCSI装置,则设备名称会是/dev/sda)。先自行创建一个新的加载目录,如在/mnt目录下创建一个usb子目录。然后插入U盘,并打开文字模式窗口如下操作,加载U盘:rootfree root#mount t vfat o iocharset=cp936/dev/sda/mnt/usbUSB设备(如:数码相机)的加载同上,只是在加载时注意您的USB设备是插入到哪个usb口,确定其设备名称/dev/sd?(?代表az)。,25卸载的umount命令 如果不需要使用加载的光盘或U盘,则需先执行卸载命令之后,才能将光盘或U盘退出:rootfree root#umount/mnt/cdrom 将光盘卸载;rootfree root#umount/mnt/usb 将U盘卸载;,6.3 Linux开发工具GUN gcc的使用,GCC常用模式及选项gcc最基本的用法是:gcc options file.gcc的整个编译过程分别是:预处理,编译,汇编和链接。gcc编译器几个最常用的选项:-o表示要求编译器生成指定文件名的可执行文件;-c表示只要求编译器进行编译生成.o的目标文件,而不要进行链接;-g要求编译器在编译的时候提供以后对程序进行调试的信息;-E表示编译器对源文件只进行预处理就停止,而不做编译、汇编和链接;-S表示编译器只进行编译,而不做汇编和链接;-O表示编译器优化生成可执行文件;-Wall生成所有的警告信息。例如:$gcc-o hello hello.c,GNU编译器生成的目标文件默认格式为elf(executive linked file)格式,由标准c源代码生成的目标文件中包含以下段:.text(正文段)包含程序的指令代码,.data(数据段)包含固定的数据,如常量,字符串等,.bss(未初始化数据段)包含未初始化的变量和数组等。这里介绍GCC常用的两种模式:编译模式和编译连接模式。$gcc-o test源文件是test.c,生成的可执行代码存放在一个名为test 的文件中。$gcc-c test.c默认情况下,生成的目标文件名为test.o,$gcc-c test.c o mytest.o下面的命令将同时编译三个源文件,即first.c、second.c和 third.c,然后将它们连接成一个可执行程序test。命令如下:$gcc-o test first.c second.c third.c,3其他常用选项的使用$gcc test.c I./inc-o test 此命令告诉GCC包含文件存放在./inc 目录下,在当前目录的上一级。若在编译时需要的包含文件存放在多个目录下,可使用多个-I 来指定各个目录:$gcc test.c I./inc I././inc2-o test 上面命令告诉GCC包含文件存放在./inc 目录下,在当前目录的上一级。若在编译时需的包含文件存放在多个目录下,可使用多个-I 来指定各个目录:$gcc test.c I./inc I././inc2-o test 这里指出了另一个包含子目录inc2,较之前目录它还要在再上两级才能找到.另外,我们还可以在编译命令行中定义符号常量。为此,我们可以简单的 在命令行中使用-D选项即可,如下例所示:$gcc-DTEST_CONFIGURATION test.c-o test 上面的命令与在源文件中加入下列命令是等效的:#define TEST_CONFIGURATION,4.警告功能 当GCC在编译过程中检查出错误的话,它就会中止编译;但检测到警告时却能继续编译生成可执行程序。在众多的警告选项之中,最常用的就是-Wall选项。该选项能发现程序中一系列的常见错误警告,该选项用法举例如下:$gcc-Wall test.c-o test 该选项相当于同时使用了下列所有的选项:unused-function:遇到仅声明过但尚未定义的静态函数时发出警告。unused-label:遇到声明过但不使用的标号的警告。unused-parameter:从未用过的函数参数的警告。,6.4 GNU make命令和makefile 文件,显式规则。此规则说明了,如何生成一个或多个目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。隐晦规则。由于make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。变量的定义。在Makefile中可定义一系列的变量,变量一般是字符串,这个有点象C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,Makefile中使用“#”字符,可以用反斜框进行转义,如:“#”。,6.4.1 Makefile文件的规则,1Makefile书写规则一个Makefile文件含有一系列的规则,规则包含以下内容。一个目标(target),即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”。一个或多个依赖文件(dependency)列表,通常是编译目标文件所需要的其他文件。一系列命今(command),是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为TAB字符。Makefile规则的一般形式如下:target:dependency dependency(tab),例如,有以下的Makefile文件:#一个简单的Makefile的例子test:prog.o code.ogcc o test prog.o code.oprog.o:prog.c prog.h code.hgcc c prog.c o prog.ocode.o:code.c code.hgcc c code.c o code.oclean:rm f*.o,一般情况下,调用make命令可输入:#make target target是Makefile文件中定义的目标之一,如果省略target,make就将生成Makefile文件中定义的第一个目标。在上面Makefile的例子中,还定义了一个目标clean,它是Makefile中常用的一种专用目标,即删除所有的目标模块。在顶层Makefile中的语句:include arch/$(ARCH)/Makefile,配置文件.config包含由用户选择项,用来存放内核配置后的结果(如make config)。规则文件Rules.make,则被所有的Makefile使用。用户通过make config配置后,产生了.config。顶层Makefile读入.config中的配置选择。顶层Makefile有两个主要的任务:产生压缩的内核镜像vmlinux文件和内核模块module。位于各个子目录下的Makefile同样也根据.config给出的配置信息,构造出当前配置下需要的源文件列表,并在文件的最后有include$(TOPDIR)/Rules.make。,2.在规则中使用通配符三种通配符:“*”,“?”和“.”。这是和Unix的B-Shell相同。波浪号(“”)字符在文件名中有特殊的用途。如“test”表示当前用户的$HOME目录下的test目录。而“hchen/test”则表示用户hchen的宿主目录下的 test目录。通配符“*.c”表示所以后缀为c的文件。例如:print:*.c lpr-p$?touch print上面这个例子说明目标print依赖于所有的.c文件。其中的“$?”是一个自动化变量。,3.文件搜寻 Makefile文件中的特殊变量“VPATH”就是完成这个功能的。VPATH=src:./headers上面的定义指定两个目录,“src”和“./headers”。目录由“冒号”分隔。另一个设置文件搜索路径的方法是使用make的“vpath”关键字(注意,它是全小写的),这不是变量,是一个make的关键字,和上面提到的那个VPATH变量很类似,但是它更为灵活。它可以指定不同的文件在不同的搜索目录中。此功能使用方法有三种:(1)vpath;为符合模式的文件指定搜索目录。(2)vpath;清除符合模式的文件的搜索目录。(3)vpath;清除所有已被设置好了的文件搜索目录。vapth使用方法中的需要包含“%”字符。“%”的意思是匹配零或若干字符。,例如:“%.h”表示所有以“.h”结尾的文件。指定了要搜索的文件集,而则指定了的文件集搜索的目录。例如:vpath%.h./headers该语句表示,要求make在“./headers”目录下搜索所有以“.h”结尾的文件。可连续地使用vpath语句,以指定不同搜索策略。如连续的vpath语句中出现了相同的,或是被重复了的,那么,make会按照vpath语句的先后顺序来执行搜索。如:vpath%.c foo vpath%blish vpath%.c bar其表示“.c”结尾的文件,先在“foo”目录,然后是“blish”,最后是“bar”目录。,4.伪目标伪目标又称假想目标,如:clean:rm*.o temp可使用一个特殊的标记“.PHONY”来指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。.PHONY:clean只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”这样。整个过程可以这样写:.PHONY:cleanclean:rm*.o temp伪目标一般没有依赖的文件。但是,可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。,如果Makefile需要生成若干个可执行文件,可把所有的目标文件都写在一个Makefile中,可声明了一个“all”的伪目标,例如:all:prog1 prog2 prog3.PHONY:allprog1:prog1.o utils.occ-o prog1 prog1.o utils.oprog2:prog2.occ-o prog2 prog2.oprog3:prog3.o sort.o utils.occ-o prog3 prog3.o sort.o utils.o上面的Makefile中的第一个目标“all”会被作为其默认目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是不如“all”这个目标新。所以,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。“.PHONY:all”声明了“all”这个目标为“伪目标”。从上面的例子可看出,目标也可以成为依赖,伪目标同样也可成为依赖。,5.多目标Makefile的规则中的目标可能有多个目标同时依赖于一个文件,且生成的命令大体类似,因此可把其合并起来。若多个目标的生成规则的执行命令是同一个时,可能会带来麻烦,这时可以使用自动化变量“$”,这个变量表示着目前规则中所有的目标的集合。例如:bigoutput littleoutput:text.ggenerate text.g-$(subst output,$)$上述规则等价于:bigoutput:text.ggenerate text.g-big bigoutputlittleoutput:text.ggenerate text.g-little littleoutput其中,-$(subst output,$)中的“$”表示执行一个Makefile的函数,函数名为subst,后面的为参数。此函数是截取字符串的意思,“$”表示目标的集合,就像一个数组,“$”依次取出目标,并执行命令。,6.静态模式静态模式可以更加容易地定义多目标的规则,可以让规则变得更加的有弹性和灵活。其语法::.targets定义了一系列的目标文件,可以有通配符,是目标的一个集合。target-parrtern是指明了targets的模式,也就是的目标集模式。prereq-parrterns是目标的依赖模式,它对target-parrtern形成的模式再进行一次依赖目标的定义。,若定义成“%.o”,则集合中都是以“.o”结尾的;若定义成“%.c”,则所形成的目标集进行二次定义,其计算方法是,取模式中的“%”(也就是去掉了.o这个结尾),并为其加上.c这个结尾,形成的新集合。所以,“目标模式”或是“依赖模式”中都应该有“%”这个字符,如果文件名中有“%”,那么可以使用反斜杠“”进行转义,来标明真实的“%”字符。例如:objects=foo.o bar.oall:$(objects)$(objects):%.o:%.c$(CC)-c$(CFLAGS)$-o$上例中,指明了目标从$object中获取,“%.o”表明要所有以“.o”结尾的目标,也就是“foo.o bar.o”;而依赖模式“%.c”则取模式“%.o”的“%”,也就是“foo bar”,并为其加上“.c”的后缀,于是,依赖目标就是“foo.c bar.c”。而命令中的“$”和“$”则是自动化变量,“$”表示所有的依赖目标集(也就是“foo.c bar.c”),“$”表示目标集(也就是“foo.o bar.o”)。,上面的规则展开后等价于下面的规则:foo.o:foo.c$(CC)-c$(CFLAGS)foo.c-o foo.obar.o:bar.c$(CC)-c$(CFLAGS)bar.c-o bar.o如果“%.o”有几百个,那种只要用这种很简单的“静态模式规则”,就可以写完一堆规则,实在是太有效率了。“静态模式规则”的用法很灵活,如果用得好,那会是一个很强大的功能。再看一个例子:files=foo.elc bar.o lose.o$(filter%.o,$(files):%.o:%.c$(CC)-c$(CFLAGS)$-o$(filter%.elc,$(files):%.elc:%.elemacs-f batch-byte-compile$(filter%.o,$(files)表示调用Makefile的filter函数,过滤“$filter”集,只要其中模式为“%.o”的内容。,7.自动生成依赖性在Makefile中,依赖关系可能会需要包含一系列的头文件,比如,如果main.c中有一句“#include defs.h”,那么我们的依赖关系应该是:main.o:main.c defs.h大多数的C/C+编译器都支持一个“-M”的选项,即自动寻找源文件中包含的头文件,并自动生成一个依赖关系。例如:cc-M main.c其输出是:main.o:main.c defs.h在使用GNU的C/C+编译器时,需用“-MM”参数代替“-M”参数,否则仍用“-M”参数就会把一些标准库的头文件也包含进来。例如:gcc-MM main.c的输出则是:main.o:main.c defs.h,GNU组织建议把编译器为每一个源文件的自动生成的依赖关系放到一个文件中,为每一个“name.c”的文件都生成一个“name.d”的Makefile文件,.d文件中就存放对应.c文件的依赖关系。于是,可以写出.c文件和.d文件的依赖关系,并让make自动更新或自成.d文件,并把其包含在主Makefile中,这样,就可以自动化地生成每个文件的依赖关系了。,下面给出了一个模式规则来产生.d文件的例子:%.d:%.cset-e;rm-f$;$(CC)-M$(CPPFLAGS)$.$;sed s,($*).o:*,1.o$:,g$;rm-f$.$例如:sources=foo.c bar.cinclude$(sources:.c=.d)上述语句中的“$(sources:.c=.d)”中的“.c=.d”的意思是做一个替换,把变量$(sources)所有.c的字串都替换成.d。应注意次序,因为include是按次来载入文件,最先载入的.d文件中的目标会成为默认目标。,6.4.2 Makefile文件的命令,1显示命令make会把其要执行的命令行在命令执行前输出到屏幕上。当用“”字符在命令行前,则命令将不被make显示出来,如:echo 正在编译XXX模块.当make执行时,会输出“正在编译XXX模块.”字串,但不会输出命令,如果没有“”,那么,make将输出:echo 正在编译XXX模块.正在编译XXX模块.如果make执行时,带入make参数“-n”或“-just-print”,则只是显示命令,而不执行命令,这个功能很有利于调试Makefile文件。而make参数“-s”或“-slient”则是全面禁止命令的显示。,2命令执行当依赖目标新于目标时,也就是当规则的目标需要被更新时,make会一条一条的执行其后的命令。如果要让上一条命令的结果应用在下一条命令时,应该使用分号分隔这两条命令。比如第一条命令是cd命令,希望第二条命令得在cd之后的基础上运行,那么就不能把这两条命令写在两行上,而应该把这两条命令写在一行上,用分号分隔。如:exec:cd/home/hchen;pwd当执行“make exec”时,cd就起作用了,pwd会打印出“/home/hchen”。,3命令出错有些时候,命令的出错并不表示就是错误的。例如mkdir命令,需要建立一个目录,如果目录不存在,那么mkdir就成功执行,如果目录存在,那么就出错了。若不希望mkdir出错而终止规则的运行,可以在Makefile的命令行前加一个减号“-”(在Tab键之后),标记为不管命令出不出错都认为是成功的。如:clean:-rm-f*.o若给make加上“-i”或是“-ignore-errors”参数,那么,Makefile中所有命令都会忽略错误。而如果一个规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。若make的参数的是“-k”或是“-keep-going”,如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。,4嵌套执行make例如,有一子目录叫subdir,这个目录下有Makefile文件,用来指明了这个目录下文件的编译规则。那么总控的Makefile可以这样书写:subsystem:cd subdir&$(MAKE)其等价于:subsystem:$(MAKE)-C subdir定义$(MAKE)宏变量的意思是make需要一些参数,这样利于维护。上面例子的意思是先进入“subdir”目录,然后执行make命令。这里把这个Makefile 叫做“总控Makefile”,总控Makefile 的变量可以传递到下级的Makefile中(如果你显式的声明),但是不会覆盖下层的Makefile中所定义的变量,除非指定了“-e”参数。,如果你要传递变量到下级Makefile中,可以使用这样的声明:export 如果你不想让某些变量传递到下级Makefile中,可以这样声明:unexport 例如:export variable+=value其等价于:variable+=valueexport variable如果一行只有一个export命令(后面没有跟什么变量),表示传递所有的变量。,5.定义命令包命令序列的语法以“define”开始,以“endef”结束,如:define run-yaccyacc$(firstword$)mv y.tab.c$endef其中:“run-yacc”是这个命令包的名字,不能与Makefile中的变量重名。在“define”和“endef”中的两行就是命令序列。这个命令包中的第一个命令是运行Yacc程序,因为Yacc程序总是生成“”的文件,所以第二行的命令就是把这个文件改名字。下面的例子中包含了这个命令包。foo.c:foo.y$(run-yacc)可见,要使用这个命令包,就好像使用变量一样。在这个命令包的使用中,命令包“run-yacc”中的“$”就是“foo.y”,“$”就是“foo.c”,make在执行命令包时,命令包中的每个命令会被依次独立执行。,6.4.3 Makefile文件的变量,1Makefile中的变量常用的变量有以下几类:版本信息版本信息有VERSION、PATCHLEVEL、SUBLEVEL、EXTRAVERSION和KERNELRE LEASE等变量,用来定义当前内核

    注意事项

    本文(基于ARM9和Linux嵌入式系统设计.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开