资源预览内容
第1页 / 共91页
第2页 / 共91页
第3页 / 共91页
第4页 / 共91页
第5页 / 共91页
第6页 / 共91页
第7页 / 共91页
第8页 / 共91页
第9页 / 共91页
第10页 / 共91页
亲,该文档总共91页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Neusoft Institute of Information05 九月 20242024/9/5大连东软信息学院大连东软信息学院 嵌入式系统导论课程嵌入式系统导论课程组组嵌入式系统导论嵌入式系统导论Neusoft Institute of Information05 九月 20242024/9/5第2章 嵌入式交叉编译环境2.1嵌入式交叉编译环境嵌入式交叉编译环境12.2NFS服务服务22.3Samba服务服务32.4Windows和和Linux混合开发模式混合开发模式42.5GCC编译器编译器52.7Make工具的使用工具的使用72.8嵌入式交叉编译环境的搭建嵌入式交叉编译环境的搭建82.6GDB调试器调试器6Neusoft Institute of Information05 九月 20242024/9/5交叉开发环境:宿主机调试通道目标机交叉开发环境:宿主机调试通道目标机“在谁的上面编写运行在谁上的程序的问题在谁的上面编写运行在谁上的程序的问题”嵌入式交叉编译环境简介嵌入式交叉编译环境简介Neusoft Institute of Information05 九月 20242024/9/5第2章 嵌入式交叉编译环境2.1嵌入式交叉编译环境嵌入式交叉编译环境12.2NFS服务服务22.3Samba服务服务32.4Windows和和Linux混合开发模式混合开发模式42.5GCC编译器编译器52.7Make工具的使用工具的使用72.8嵌入式交叉编译环境的搭建嵌入式交叉编译环境的搭建82.6GDB调试器调试器6Neusoft Institute of Information05 九月 20242024/9/52.2NFS服务服务NFS服务可以使网络上的服务可以使网络上的同为同为Linux或或Unix系系统统主机共享文件系统。主机共享文件系统。NFS可以将远程文件系统载入在本地文件系统可以将远程文件系统载入在本地文件系统下下。远程的硬盘、目录和光驱都可以变成本地。远程的硬盘、目录和光驱都可以变成本地主机目录树中的一个子目录。载入后与处理自主机目录树中的一个子目录。载入后与处理自己的文件系统一样使用即可。不只方便,也节己的文件系统一样使用即可。不只方便,也节省了重复保存文件的空间、传输文件的时间及省了重复保存文件的空间、传输文件的时间及网络带宽。网络带宽。Neusoft Institute of Information05 九月 20242024/9/5NFS特点特点NFS系统也是使用系统也是使用C/S体系结构,就是有服务体系结构,就是有服务器端与客户端器端与客户端服务器端提供共享的文件系统,必须把文件系服务器端提供共享的文件系统,必须把文件系统输出统输出(export)出去出去客户端则要把文件系统载入到自己的系统下客户端则要把文件系统载入到自己的系统下使用使用NFS,需要在服务器端设置输出,在客户,需要在服务器端设置输出,在客户端设置载入端设置载入2.2NFS服务服务Neusoft Institute of Information05 九月 20242024/9/5NFS服务器端配置服务器端配置(1)关闭防火墙关闭防火墙(2)配置共享目录配置共享目录-客户端主机客户端主机IP范围范围(3)主机主机IP(4)启动启动NFS服务服务2.2NFS服务服务NFS客户端客户端(1)设置客户端设置客户端IP地址地址(2)挂载共享目录挂载共享目录mount-tnfs主机主机ip:共享目录共享目录挂载点挂载点注意事项:关闭防火墙,主机与客户端在同一注意事项:关闭防火墙,主机与客户端在同一ip段段Neusoft Institute of Information05 九月 20242024/9/5具体配置步骤具体配置步骤服务器端服务器端1)关闭防火墙)关闭防火墙2.2NFS服务服务Neusoft Institute of Information05 九月 20242024/9/52)配置)配置NFS服务器服务器2.2NFS服务服务Neusoft Institute of Information05 九月 20242024/9/52-1)设置共享目)设置共享目录和主机范围录和主机范围2.2NFS服务服务Neusoft Institute of Information05 九月 20242024/9/52-2)设置其他选项)设置其他选项2.2NFS服务服务Neusoft Institute of Information05 九月 20242024/9/52.2NFS服务服务2-3)设置其他选项)设置其他选项Neusoft Institute of Information05 九月 20242024/9/53)设置设置NFS服务器的服务器的IP2.2NFS服务服务Neusoft Institute of Information05 九月 20242024/9/54)启动)启动NFS服务服务2.2NFS服务服务Neusoft Institute of Information05 九月 20242024/9/5客户端客户端1)配置)配置ip2.2NFS服务服务Neusoft Institute of Information05 九月 20242024/9/52)挂载)挂载NFS2.2NFS服务服务Neusoft Institute of Information05 九月 20242024/9/5第2章 嵌入式交叉编译环境2.1嵌入式交叉编译环境嵌入式交叉编译环境12.2NFS服务服务22.3Samba服务服务32.4Windows和和Linux混合开发模式混合开发模式42.5GCC编译器编译器52.7Make工具的使用工具的使用72.8嵌入式交叉编译环境的搭建嵌入式交叉编译环境的搭建82.6GDB调试器调试器6Neusoft Institute of Information05 九月 20242024/9/5Samba服务可实现服务可实现Windows和和Linux不同系不同系统统间交换文件共享。间交换文件共享。2.3Samba服务服务Neusoft Institute of Information05 九月 20242024/9/5具体设置步骤具体设置步骤服务器端服务器端1)关闭防火墙)关闭防火墙(同(同NFS)2.3Samba服务服务Neusoft Institute of Information05 九月 20242024/9/52)配置)配置Samba服务器服务器2.3Samba服务服务Neusoft Institute of Information05 九月 20242024/9/52-1)设置共享目录)设置共享目录和访问权限和访问权限2.3Samba服务服务Neusoft Institute of Information05 九月 20242024/9/52.3Samba服务服务2-2)设置共享目录)设置共享目录和访问权限和访问权限Neusoft Institute of Information05 九月 20242024/9/52.3Samba服务服务Neusoft Institute of Information05 九月 20242024/9/52.3Samba服务服务2-4)服务器设置)服务器设置Neusoft Institute of Information05 九月 20242024/9/52.3Samba服务服务2-4)服务器设置)服务器设置Neusoft Institute of Information05 九月 20242024/9/53)配置)配置Samba服务器主机服务器主机ip2.3Samba服务服务Neusoft Institute of Information05 九月 20242024/9/54)启动)启动Samba服务服务2.3Samba服务服务Neusoft Institute of Information05 九月 20242024/9/5客户端客户端1)配置)配置Windows的的IP只要和你开的服务器只要和你开的服务器IP在同一网段就行在同一网段就行 2.3Samba服务服务Neusoft Institute of Information05 九月 20242024/9/52)在)在Windows上访问共享上访问共享2.3Samba服务服务Neusoft Institute of Information05 九月 20242024/9/53)访问成功)访问成功2.3Samba服务服务Neusoft Institute of Information05 九月 20242024/9/5第2章 嵌入式交叉编译环境2.1嵌入式交叉编译环境嵌入式交叉编译环境12.2NFS服务服务22.3Samba服务服务32.4Windows和和Linux混合开发模式混合开发模式42.5GCC编译器编译器52.7Make工具的使用工具的使用72.8嵌入式交叉编译环境的搭建嵌入式交叉编译环境的搭建82.6GDB调试器调试器6Neusoft Institute of Information05 九月 20242024/9/5混合开发模式的必要:混合开发模式的必要:由于初学者对由于初学者对Linux系统不是很熟悉,通常会采系统不是很熟悉,通常会采用用Windows下强大的编辑工具,通过共享再在下强大的编辑工具,通过共享再在Linux系统下进行编译、调试等工作。系统下进行编译、调试等工作。(1)VMware虚拟机设置共享虚拟机设置共享(2)SSH客户端软件客户端软件(3)Windows下的文本编辑工具下的文本编辑工具2.4Windows和和Linux混合开发模式混合开发模式Neusoft Institute of Information05 九月 20242024/9/5(1)VMware虚拟机设置共享虚拟机设置共享-12.4Windows和和Linux混合开发模式混合开发模式Neusoft Institute of Information05 九月 20242024/9/5(1)VMware虚拟机设置共享虚拟机设置共享-22.4Windows和和Linux混合开发模式混合开发模式解压缩文件解压缩文件tarzxvfVMwareTools-5.0.0-13124.tar.gzC/home安装文件安装文件进入解压缩后的文件夹:进入解压缩后的文件夹:cdvmware-tools-distrib/安装:安装:Neusoft Institute of Information05 九月 20242024/9/5(1)VMware虚拟机设置共享虚拟机设置共享-32.4Windows和和Linux混合开发模式混合开发模式设置共享设置共享Neusoft Institute of Information05 九月 20242024/9/5(2)SSH客户端软件客户端软件2.4Windows和和Linux混合开发模式混合开发模式SSH的英文全称:的英文全称:SecureShellSSH把所有传输的数据进行加密,并且把所有传输的数据进行加密,并且SSH客户端软件可将传输客户端软件可将传输的数据进行压缩后再传输。的数据进行压缩后再传输。(1)PuTTY(2)SecureShellClientNeusoft Institute of Information05 九月 20242024/9/5(3)Windows下的文本编辑工具下的文本编辑工具2.4Windows和和Linux混合开发模式混合开发模式UltraEdit-32SourceInsightNeusoft Institute of Information05 九月 20242024/9/5第2章 嵌入式交叉编译环境2.1嵌入式交叉编译环境嵌入式交叉编译环境12.2NFS服务服务22.3Samba服务服务32.4Windows和和Linux混合开发模式混合开发模式42.5GCC编译器编译器52.7Make工具的使用工具的使用72.8嵌入式交叉编译环境的搭建嵌入式交叉编译环境的搭建82.6GDB调试器调试器6Neusoft Institute of Information05 九月 20242024/9/5gcc(GNUCCompiler)能将能将C、C+语言源程序、汇编语言程序和目标语言源程序、汇编语言程序和目标程序编译、连接成可执行文件。是程序编译、连接成可执行文件。是GNU推出的功推出的功能强大、性能优越的多平台编译器,可以在多种能强大、性能优越的多平台编译器,可以在多种硬体平台上编译出可执行程序,其执行效率与一硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高般的编译器相比平均效率要高20%30%。2.5GCC编译器编译器Neusoft Institute of Information05 九月 20242024/9/5gcc的执行过程的执行过程使用使用gcc由由C语言源代码文件生成可执行文件的过程语言源代码文件生成可执行文件的过程要经历四个相互关联的步骤要经历四个相互关联的步骤 1、预处理预处理(也称预编译,也称预编译,Preprocessing)对头文件(对头文件(include)、预编译语句(如)、预编译语句(如define等)进行分析等)进行分析预处理器预处理器cpp2、编译、编译(Compilation)将预处理后的文件转换成汇编语言将预处理后的文件转换成汇编语言,生成文件生成文件.s编译器编译器ccl3、汇编、汇编(Assembly)由汇编变为目标代码由汇编变为目标代码(机器代码机器代码),生成,生成.o的文件的文件汇编器汇编器as4、连接、连接(Linking)连接目标代码连接目标代码,生成可执行程序生成可执行程序链接器链接器ld2.5GCC编译器编译器Neusoft Institute of Information05 九月 20242024/9/5gcc的执行过程(ESc)四个相互关联的步骤四个相互关联的步骤 源文件源文件.c1、.c源文件源文件2、生成、生成.i文件文件3、生成文件、生成文件.s4、生成、生成.o的文件的文件5、生成可执行程序、生成可执行程序41-E-E-S-S-c-c预处理预处理编译编译汇编汇编链接链接2.5GCC编译器编译器Neusoft Institute of Information05 九月 20242024/9/5GNUC的使用的使用基本语法基本语法gccoptionsfilenames说明:说明:在在gcc后面可以有多个编译选项,同时进行多个编译后面可以有多个编译选项,同时进行多个编译操作。操作。当你不用任何选项编译一个程序时,当你不用任何选项编译一个程序时,GCC将会建立将会建立(假假定编译成功定编译成功)一个名为的可执行文件。一个名为的可执行文件。2.5GCC编译器编译器Neusoft Institute of Information05 九月 20242024/9/5gcc选项选项-o选项选项你能用你能用-o编译选项来为将产生的可执行文件指定一个文件编译选项来为将产生的可执行文件指定一个文件名来代替名来代替。 例:例:-c选项:告诉选项:告诉GCC仅把源代码编译为目标代码仅把源代码编译为目标代码,而取消连而取消连接的步骤。缺省时接的步骤。缺省时GCC建立的目标代码文件有一个建立的目标代码文件有一个.o的扩的扩展名。展名。 例:例:-E只运行只运行C预编译器。预编译器。-S编译选项告诉编译选项告诉gcc在为在为C代码产生了汇编语言文件后代码产生了汇编语言文件后停止编译。停止编译。2.5GCC编译器编译器Neusoft Institute of Information05 九月 20242024/9/5-includefile功能相当于在代码中使用#include例子用法:gcc -o example example.c -include /usr/include-I 用来指定头文件目录用来指定头文件目录./usr/include目录一般是不用指定的目录一般是不用指定的,但是如果头文件不在但是如果头文件不在/usr/include里我们就要用里我们就要用-I参数指定了,比如头文件放在参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上目录里,那编译命令行就要加上-Imyinclude参数了,如果不加你会得到一个参数了,如果不加你会得到一个“xxxx.h:Nosuchfileordirectory”的错误。的错误。2.5GCC编译器编译器Neusoft Institute of Information05 九月 20242024/9/5第2章 嵌入式交叉编译环境2.1嵌入式交叉编译环境嵌入式交叉编译环境12.2NFS服务服务22.3Samba服务服务32.4Windows和和Linux混合开发模式混合开发模式42.5GCC编译器编译器52.7Make工具的使用工具的使用72.8嵌入式交叉编译环境的搭建嵌入式交叉编译环境的搭建82.6GDB调试器调试器6Neusoft Institute of Information05 九月 20242024/9/5Gdb(GNUdebugger)是)是GNU开发组织发布的开发组织发布的一个强大的一个强大的Unix/Linux下的程序调试工具。下的程序调试工具。是一个命令行的调试器,但是一个命令行的调试器,但gdb具有比很多图形具有比很多图形化调试器更强大的功能。化调试器更强大的功能。可以调试各种程序,包括可以调试各种程序,包括C,C+,JAVA,PASCAL等等具有远程调试功能对嵌入式非常有用具有远程调试功能对嵌入式非常有用2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5Gdb主要可以完成下面任务:主要可以完成下面任务:(1)启动程序,并可以指定某些参数控制程序的)启动程序,并可以指定某些参数控制程序的运行运行(2)可让被调试的程序在用户所指定的断点处停)可让被调试的程序在用户所指定的断点处停住住(3)当程序停止时,检查程序的状态)当程序停止时,检查程序的状态(4)动态地改变程序的参数,可以避过)动态地改变程序的参数,可以避过bug,继,继续查找其他的问题续查找其他的问题2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5gdbprogram也就是你的执行文件,一般在当前目录下也就是你的执行文件,一般在当前目录下2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5Gdb的命令可以使用的命令可以使用help命令来查看,命令来查看,help命令只是列命令只是列出出gdb的命令种类。的命令种类。可以使用可以使用help命令,显示命令,显示class种类中的所有命种类中的所有命令。令。可以使用可以使用help命令,查看命令,查看command命令命令的帮助。的帮助。Gdb中输入命令时,可以不用输入命令的全称,只用输中输入命令时,可以不用输入命令的全称,只用输入命令的前几个字符就可以。入命令的前几个字符就可以。在在linux下,可以按两次下,可以按两次TAB键来补齐命令的全称。键来补齐命令的全称。Gdb中运行中运行Linux的的shell程序,如程序,如shell。2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/53.3GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5加载要调试的执行文件加载要调试的执行文件file加载要调试的执行程序加载要调试的执行程序exec。2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/53.3GDB调试器调试器查看源代码查看源代码list显示程序第显示程序第linenum行的周围的源程序行的周围的源程序list显示函数名为显示函数名为function的函数周围的源程序的函数周围的源程序list显示当前行后面的源程序显示当前行后面的源程序list-显示当前行前面的源程序显示当前行前面的源程序setlistsizen设置一次显示源代码的行数设置一次显示源代码的行数showlistsize查看当前查看当前listsize的设置的设置2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5设置断点(设置断点(BreakPoint)break-进入指定函数时停住。进入指定函数时停住。break-在指定行号停住在指定行号停住2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5清除断点清除断点deletebreakpointsrange删除指定的断点,删除指定的断点,breakpoints为断点号,为断点号,range表示表示断点号的范围(如:断点号的范围(如:2-4)。如果不指定断点号,则)。如果不指定断点号,则表示删除所有的断点。其简写命令为表示删除所有的断点。其简写命令为d。比删除更好的一种方法是比删除更好的一种方法是disable断点,断点,disable了断了断点,点,gdb不会删除,当还需要时,不会删除,当还需要时,enable即可,就即可,就好像回收站一样。好像回收站一样。2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/53.3GDB调试器调试器设置观察点设置观察点观察点一般用来观察某个表达式的值是否变化了。观察点一般用来观察某个表达式的值是否变化了。watch为表达式(变量)为表达式(变量)expr设置一个观察点。一旦表达设置一个观察点。一旦表达式值有变化时,马上停住。式值有变化时,马上停住。infowatchpoints列出当前设置的所有观察点列出当前设置的所有观察点2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5恢复程序运行和单步调试恢复程序运行和单步调试run(r)从程序开始运行程序从程序开始运行程序continue(c)恢复程序运行,直到程序结束,或是下一个断点到来。恢复程序运行,直到程序结束,或是下一个断点到来。step(s)单步执行,进入调用的函数的内部单步执行,进入调用的函数的内部next(n)单步执行,不会进入调用的函数内部单步执行,不会进入调用的函数内部finish(f)如果已进入了某函数,而想退出该函数返回到它的调用函数中如果已进入了某函数,而想退出该函数返回到它的调用函数中2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5查看运行时数据查看运行时数据print查看当前程序的运行数据。查看当前程序的运行数据。为格式。为格式。2.6GDB调试器调试器退出退出GDBquitorq退出退出GDBNeusoft Institute of Information05 九月 20242024/9/5练习练习1(1)键入键入vi,编辑一个新文件。其内容如下:,编辑一个新文件。其内容如下:#includemain()inta,i=0;a=0;while(i10)a=a+2;printf(thevalueofa=%dn,a);sleep(1);i=i+1;2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5练习练习1(2)保存退出保存退出exam.c编译编译exam.c。使用使用gcc-oexamoexam.c使用使用比较比较gexam与与examo的大小,因为的大小,因为gexam含有调试含有调试信息,所以信息,所以gexam比比examo大。大。执行执行gexam与与examo执行执行examo键入键入./examo。这里。这里./表示当前目录表示当前目录执行执行gexam键入键入./gexam。2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5练习练习1(3)使用使用gdb调试程序调试程序(1)启动)启动gdb程序程序(gdb)gdb(2)读入调试程序)读入调试程序(gdb)filegexam(3)列出相应于正在执行的程序的原文件内容)列出相应于正在执行的程序的原文件内容(gdb)list(4)在程序)在程序a=0;处设置一个断点处设置一个断点(gdb)break4(注:这里(注:这里4为程序为程序a=0;所在程序的行号,若自己所在程序的行号,若自己更改)更改)(5)在程序)在程序printf(“thevalueofa=%dn”,a);处设置一个断点处设置一个断点(6)执行该程序)执行该程序(gdb)run(7)查看变量)查看变量a的值的值(gdb)printa(8)查看变量)查看变量a的类型的类型(gdb)whatisa(9)执行下一个源程序行)执行下一个源程序行(gdb)next(10)从断点开始继续执行到下一个断点)从断点开始继续执行到下一个断点(gdb)continue(11)查看变量)查看变量a的值的值(gdb)printa,看看,看看a是否有变化是否有变化(12)不停地执行()不停地执行(gdb)continue,直到程序结束。,直到程序结束。(13)退出)退出gdbquit2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5练习练习2:程序功能为先显示一个字符串,再反序显示,使用:程序功能为先显示一个字符串,再反序显示,使用GDB找找出其中的错误并改正出其中的错误并改正#includevoidmy_print(char*string)printf(Thestringis%sn,string);voidmy_print2(char*string)char*string2;intsize,i;size=strlen(string);string2=(char*)malloc(size+1);for(i=0;isize;i+)string2size-i=stringi;string2size+1=0;printf(Thestringprintedbackwardis%sn,string2); 2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5练习练习2:程序功能为先显示一个字符串,再反序显示,使:程序功能为先显示一个字符串,再反序显示,使用用GDB找出其中的错误并改正找出其中的错误并改正intmain()charmy_string=hellothere;my_print(my_string);my_print2(my_string);return;2.6GDB调试器调试器Neusoft Institute of Information05 九月 20242024/9/5第2章 嵌入式交叉编译环境2.1嵌入式交叉编译环境嵌入式交叉编译环境12.2NFS服务服务22.3Samba服务服务32.4Windows和和Linux混合开发模式混合开发模式42.5GCC编译器编译器52.7Make工具的使用工具的使用72.8嵌入式交叉编译环境的搭建嵌入式交叉编译环境的搭建82.6GDB调试器调试器6Neusoft Institute of Information05 九月 20242024/9/53.4make工具的使用工具的使用Make工具及工具及makefile文件概述文件概述Makefile基本知识基本知识Makefile应用应用1)为单个文件编写)为单个文件编写makefile2)为多个文件编写)为多个文件编写makefile3)使用不同目录的文件的)使用不同目录的文件的makefile的写法的写法Neusoft Institute of Information05 九月 20242024/9/5Make工具及工具及makefile文件概述文件概述GNUMake是程序自动维护工具是程序自动维护工具在大型的开发项目中,通常有几十到上百个的源文件,如果每在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入次均手工键入 gcc gcc 命令进行编译的话,则会命令进行编译的话,则会 非常不方便。因此,非常不方便。因此,人们通常利用人们通常利用 make make 工具来自动完成编译工作。工具来自动完成编译工作。这些工作包括:这些工作包括: 1 1)如果仅修改了某几个)如果仅修改了某几个 源文件,则只重新编译这几个源文件;源文件,则只重新编译这几个源文件; 2 2)如果某个头文件被修改了,则重新编译所有包含该头文件的)如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。源文件。Neusoft Institute of Information05 九月 20242024/9/5Makefile基本知识基本知识基本基本makefilemakefile结构结构Makefile由一系列规则组成,规则格式如下:由一系列规则组成,规则格式如下:其中:其中:target需要由需要由make工具创建的项目,工具创建的项目,通常是目的文件和可执通常是目的文件和可执行文件。通常使用行文件。通常使用“目标(目标(target)”一词来表示要创建的项目。一词来表示要创建的项目。prerequisites要创建的项目依赖于哪些文件。要创建的项目依赖于哪些文件。command 创建每个项目时需要运行的命令。创建每个项目时需要运行的命令。注:命令前面需要敲入注:命令前面需要敲入tab键,而不是空格!键,而不是空格!target:prerequisites依赖关系依赖关系command命令命令Neusoft Institute of Information05 九月 20242024/9/5Make工具及工具及makefile文件概述文件概述MakeMake及及makefilemakefile原理原理GNU makeGNU make的主要工作是读进文本文件的主要工作是读进文本文件makefilemakefile。这些文件主要是。这些文件主要是有关那些文件(目的文件)是从哪些别的文件(依靠文件)中产有关那些文件(目的文件)是从哪些别的文件(依靠文件)中产生的,用什么命令来进行这个产生的过程。生的,用什么命令来进行这个产生的过程。有了这些信息,有了这些信息,makemake会检查磁盘上的文件,如果目的文件的时间会检查磁盘上的文件,如果目的文件的时间比至少它的一个依靠文件旧,比至少它的一个依靠文件旧,MakeMake将执行相应的命令,以便更新将执行相应的命令,以便更新目的文件。目的文件不一定是最后的可执行文件,它可以是任何目的文件。目的文件不一定是最后的可执行文件,它可以是任何一个文件。一个文件。 Neusoft Institute of Information05 九月 20242024/9/5Makefile基本知识基本知识Makefile实例:实例:makefile开始开始myprog:foo.obar.ogccfoo.obar.o-omyprogfoo.o:foo.cfoo.hbar.hgcc-cfoo.c-ofoo.obar.o:bar.cbar.hgcc-cbar.c-obar.oclean:-rm*.omyprogmakefile结束结束Neusoft Institute of Information05 九月 20242024/9/5Makefile基本知识基本知识实例说明实例说明从上面的例子注意到,第一个字符为从上面的例子注意到,第一个字符为#的行为注释行。的行为注释行。第一个非注释行指定第一个非注释行指定myprog为目标,并且依赖于为目标,并且依赖于foo.o和和文件。文件。foo.o和文件又各自有自己的依赖规则和文件又各自有自己的依赖规则makefile中一般都有中一般都有clean规则,在重新编译之前删除以前生成规则,在重新编译之前删除以前生成的各个文件,此条规则没有依赖文件的各个文件,此条规则没有依赖文件使用使用make工具的执行工具的执行makefile的命令为:的命令为:make或或makemakefile)缺省文件名为当前目录下的缺省文件名为当前目录下的makefile或或Makefile或或GNUmakefile,也可以使用命令行参数,也可以使用命令行参数f指定文件名指定文件名:例如例如makeffilenameNeusoft Institute of Information05 九月 20242024/9/5Makefile基本知识基本知识实例说明实例说明如果没有如果没有“-f”参数,在参数,在Linux中,中,GNUmake工具在当前工作工具在当前工作目录中按照目录中按照GNUmakefile、makefile、Makefile的顺序搜索的顺序搜索makefile文件。文件。通过命令行参数中的通过命令行参数中的target,可指定,可指定make要编译的目标,并且要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译译target选项中指定的目标文件。选项中指定的目标文件。如果命令行中没有指定目标,则系统默认如果命令行中没有指定目标,则系统默认target指向描述文件中指向描述文件中第一个目标文件。第一个目标文件。如如makemakecleanNeusoft Institute of Information05 九月 20242024/9/5Makefile基本知识基本知识Makefile变量变量环境变量:环境变量:(1)存储文件名列表。)存储文件名列表。(2)存储可执行文件名。)存储可执行文件名。(3)存储编译器标识。)存储编译器标识。 (4)存储参数列表。)存储参数列表。 比如我们利用比如我们利用makefile变量把上面的变量把上面的makefile文件重写一遍。文件重写一遍。Neusoft Institute of Information05 九月 20242024/9/5Makefile基本知识基本知识Makefile变量变量使用环境变量后的使用环境变量后的makefile实例实例=makefile开始开始=CC=gccCFLAGS=-Wall O gEXEC=myprog$(EXEC):$(OBJS)$(CC) $(OBJS) o $(EXEC)=makefile结束结束=Neusoft Institute of Information05 九月 20242024/9/5Makefile基本知识基本知识Makefile变量变量内部变量:内部变量:$-$-扩展成当前规则的目的文件名扩展成当前规则的目的文件名$ $ - -扩展成依靠列表中的第一个依靠文件扩展成依靠列表中的第一个依靠文件$ -$ -扩展成整个依靠的列表扩展成整个依靠的列表利用这些变量,可以把上面的利用这些变量,可以把上面的makefilemakefile写成:写成:Neusoft Institute of Information05 九月 20242024/9/5Makefile基本知识基本知识Makefile变量变量=makefile开始=CC = gccCFLAG =-Wall O gmyprog:$(OBJS)$(CC) $ -o $(CC) $(CFLAG) c $ -o $(CC) $(CFLAG) c $ -o $=makefile结束=Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用为单个文件编写为单个文件编写makefile为多个文件编写为多个文件编写makefile使用不同目录的文件的使用不同目录的文件的makefile的写法的写法多个子模块的文件的多个子模块的文件的makefile写法写法Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用为单个文件编写为单个文件编写makefile编写程序编写程序#include int main(void) printf(Hello world!n); return 0;Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用执行:执行:$viMakefile=makefile开始=# This is a sampleCC = gccclean:rm *.o hello=makefile结束=Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用为多个文件编写为多个文件编写makefile有四个文件,有四个文件,/*menu.c*/#include#include#include#include“”int main(void)int main(void) int choice; int choice; printf(-welcome you ! -n); printf(-welcome you ! -n); printf( * 1 music! *n); printf( * 1 music! *n); printf( * 2 picture! *n); printf( * 2 picture! *n); printf(-have a choice!-n); printf(-have a choice!-n); scanf( scanf(d,&choice);d,&choice); switch(choice)switch(choice) case 1:case 1:music();music();break;break;case 2:case 2:picture();picture();break;break; printf(Good Bye!n);printf(Good Bye!n); return 0; return 0; Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用为多个文件编写为多个文件编写makefile/*music.c*/#include#include void music(void) printf(Listen to music!n); Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用为多个文件编写为多个文件编写makefile/*picture.c*/#includevoid picture(void) printf(Have a look at picture!n);Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用为多个文件编写为多个文件编写makefile/*/void music(void); void picture(void);Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用为多个文件编写为多个文件编写makefile几个文件间的依赖关系几个文件间的依赖关系menumusic.omenu.opicture.omenu.hpicture.cmenu.cmusic.cNeusoft Institute of Information05 九月 20242024/9/5Makefile应用应用上面程序的上面程序的makefile:=makefile开始开始=CC=gcc$(CC) menu.o music.o picture.o -o menumusic.o:music.c picture.o:picture.c clean:rm *.o menu=makefile结束结束=Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用上面程序的上面程序的makefile:实际上,可以用实际上,可以用$代表目标文件,代表目标文件,$代表源文件,于是可以将代表源文件,于是可以将makefile写成这样:写成这样:=makefile开始开始=CC=gcc$(CC) $ -o menu$(CC) -c $ -o $music.o:music.c $(CC) -c $ -o $picture.o:picture.c $(CC) -c $ -o $clean:rm *.o menu=makefile结束结束=Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用上面程序的上面程序的makefile:由于各个文件的编译命令几乎没有由于各个文件的编译命令几乎没有什么差别,可以使用通配符什么差别,可以使用通配符%或或*进一步简化进一步简化 :=makefile开始开始=CC=gcc $(CC) $ -o menu%.o:%.c$(CC) -c -o $ $clean:rm *.o menu=makefile结束结束=Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用使用不同目录的文件的使用不同目录的文件的makefile的写法的写法假设程序的目录结构如下:假设程序的目录结构如下:bin存放生成的可执行文件存放生成的可执行文件(menu)obj存放存放.o文件文件()include存放存放.h文件文件()src存放源程序文件和存放源程序文件和)Neusoft Institute of Information05 九月 2024Makefile应用应用=makefile开始开始=CC=gccall:./ ./ ./$(CC) -o ./bin/menu $./ ./include/ $(CC) -o $ -c $ -I ./include./ $(CC) -o $ -c $./$(CC) o $ -c $clean:rm ./bin/menu=makefile结束结束=Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用=makefile开始开始=CC=gccSRC_DIR = ./OBJ_DIR = ./obj/BIN_DIR = ./bin/INC_DIR = ./include $( $($(CC) $ -o $(BIN_DIR)menu$( $(INC_DIR)/$(CC) -I$(INC_DIR) -c -o $ $( $(CC) -c $ -o $( $(CC) -c $ -o $clean:rm $(BIN_DIR)menu=makefile结束结束=Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用多个子模块的文件的多个子模块的文件的makefile写法写法以上面的文件(多个目录)为例,将、和分别放入以上面的文件(多个目录)为例,将、和分别放入src目目录下的三个子目录录下的三个子目录menu、music和和picture中,创造多中,创造多模块环境模块环境需要写四个需要写四个makefile,分别为于,分别为于src、menu、music目目和和picture目录下,分别管理各自目录下的文件目录下,分别管理各自目录下的文件Neusoft Institute of Information05 九月 20242024/9/5Makefile应用应用src目录下的目录下的makefileCC=gccSRC_DIR=./OBJ_DIR=./obj/BIN_DIR=./bin/INC_DIR=./include$($($(CC)$-o$(BIN_DIR)menuinclude$(SRC_DIR)menu/makefileinclude$(SRC_DIR)music/makefileinclude$(SRC_DIR)picture/makefileNeusoft Institute of Information05 九月 20242024/9/5Makefile应用应用src/menu目录下的makefile$( $(INC_DIR)/$(CC) -I$(INC_DIR) -c -o $ $src/music目录下的makefile$( $(CC) -c $ -o $src/picture目录下的makefile$( $(CC) -c $ -o $
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号