《第2章 嵌入式交叉编译环境.ppt》由会员分享,可在线阅读,更多相关《第2章 嵌入式交叉编译环境.ppt(81页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、十二月 29,20222022/12/29淮阴师范学院淮阴师范学院 嵌入式系统课程组嵌入式系统课程组嵌入式系统导论嵌入式系统导论第第2 2章章 嵌入式系统交叉编译环嵌入式系统交叉编译环境境十二月 29,20222022/12/29第2章 嵌入式交叉编译环境2.1嵌入式交叉编译环境嵌入式交叉编译环境12.2 LinuxLinux系统安装系统安装22.3Windows2.3Windows和和LinuxLinux混合开发模式混合开发模式32.4Linux2.4Linux下常用命令下常用命令42.5GCC2.5GCC编译器编译器52.7Make2.7Make工具的使用工具的使用782.6GDB调试器调
2、试器62.82.8嵌入式交叉编译环境的搭建嵌入式交叉编译环境的搭建十二月 29,20222022/12/29嵌入式系统中没有足够的硬件资源支持运行开嵌入式系统中没有足够的硬件资源支持运行开发工具和调试工具,因此嵌入式软件开发采用发工具和调试工具,因此嵌入式软件开发采用交叉编译、调试的方式。交叉编译、调试的方式。一般把交叉编译的主机称为宿主机,也就是普一般把交叉编译的主机称为宿主机,也就是普通的通的PC,而把软件实际运行的环境称为目标,而把软件实际运行的环境称为目标机。机。在编译阶段,借助宿主机编译出目标机的可执在编译阶段,借助宿主机编译出目标机的可执行代码,在调试阶段,一般应用软件的调试器行代
3、码,在调试阶段,一般应用软件的调试器和被调试的程序运行在同一台计算机上,但在和被调试的程序运行在同一台计算机上,但在嵌入式软件中,调试器运行在宿主机上,被调嵌入式软件中,调试器运行在宿主机上,被调试的程序运行在特定的嵌入式系统硬件平台上,试的程序运行在特定的嵌入式系统硬件平台上,他们之间通过串口或以太网口进行交互。他们之间通过串口或以太网口进行交互。2.1嵌入式交叉编译环境简介嵌入式交叉编译环境简介十二月 29,20222022/12/29交叉开发环境:宿主机调试通道目标机交叉开发环境:宿主机调试通道目标机“在谁的上面编写运行在谁上的程序的问题在谁的上面编写运行在谁上的程序的问题”2.1嵌入式
4、交叉编译环境简介嵌入式交叉编译环境简介十二月 29,20222022/12/292.2Linux系统安装系统安装安装虚拟机安装虚拟机VMware在在Vmware下进行安装前的配置下进行安装前的配置在在VMware下安装下安装Linux系统系统十二月 29,20222022/12/29混合开发模式的必要:混合开发模式的必要:由于初学者对由于初学者对Linux系统不是很熟悉,通常会系统不是很熟悉,通常会采用采用Windows下强大的编辑工具,通过共享再下强大的编辑工具,通过共享再在在Linux系统下进行编译、调试等工作。系统下进行编译、调试等工作。(1)Windows下的文本编辑工具下的文本编辑工
5、具(2)VMware虚拟机设置共享(安装虚拟机工具)虚拟机设置共享(安装虚拟机工具)(3)samba服务(提供服务(提供windows和和Linux下程序下程序的共享)的共享)(4)nfs服务(提供服务(提供Linux和和Linux下程序的共享)下程序的共享)2.3Windows和和Linux混合开发模式混合开发模式十二月 29,20222022/12/29(1)VMware虚拟机工具安装虚拟机工具安装2.3Windows和和Linux混合开发模式混合开发模式十二月 29,20222022/12/29(1)VMware虚拟机工具安装虚拟机工具安装2.3Windows和和Linux混合开发模式混
6、合开发模式解压缩文件解压缩文件tarzxvfVMwareTools-5.0.0-13124.tar.gzC/home安装文件安装文件进入解压缩后的文件夹:进入解压缩后的文件夹:cdvmware-tools-distrib/安装:安装:./vmware-install.pl十二月 29,20222022/12/29(1)VMware虚拟机设置共享虚拟机设置共享-12.3Windows和和Linux混合开发模式混合开发模式设置共享设置共享十二月 29,20222022/12/29(1)VMware虚拟机设置共享虚拟机设置共享-12.3Windows和和Linux混合开发模式混合开发模式访问共享访问
7、共享在在LinuxLinux的的/mnt/hgfsmnt/hgfs目录下可以访问目录下可以访问windowswindows下共享的文件夹下共享的文件夹cdcd/mnt/hgfsmnt/hgfs十二月 29,20222022/12/292.4Linux下常用命令下常用命令ls:显示当前目录下的所有文件和目录:显示当前目录下的所有文件和目录。ls-a:可以看到隐藏的文件,如以:可以看到隐藏的文件,如以.开头的文件开头的文件。pwd:显示当前目录路径:显示当前目录路径。ps:列举当前:列举当前TTY下所有进程下所有进程ps-A:列举所有:列举所有cd目录名:进入目录目录名:进入目录mkdir目录名:
8、创建目录目录名:创建目录rmdir目录名:删除空目录目录名:删除空目录rm-rf目录名:强行删除整个目录内容(无法恢复),其中目录名:强行删除整个目录内容(无法恢复),其中f表示表示强制不进行提示,强制不进行提示,r表示目录递归表示目录递归。man表示帮助命令表示帮助命令注:注:LINUX下的文件和目录是区分大小写的下的文件和目录是区分大小写的。十二月 29,20222022/12/292.4Linux下常用命令下常用命令压缩备份压缩备份bzip2:.bz2文件的压缩程序。bunzip2:.bz2文件的解压缩程序。tar:备份文件。tar是用来建立,还原备份文件的工具程序,它可以加入,解开备份
9、文件内的文件。十二月 29,20222022/12/292.4Linux下常用命令下常用命令解压,解压,.tar.bz2文件:文件:tar-xjf文件名文件名解压缩解压缩:.bin.gzgzip-d文件名文件名例例:把把abc.tar解压到解压到/myftp,命令是啥命令是啥?tarxvfabc.tar-C/myftpbz2解压解压1:bzip2-dFileName.bz2解压解压2:bunzip2FileName.bz2压缩:压缩:bzip2-zFileName.tar.bz2解压:解压:tarjxvfFileName.tar.bz2压缩:压缩:tarjcvfFileName.tar.bz2
10、DirName十二月 29,20222022/12/292.4Linux下常用命令下常用命令.bz解压解压1:bzip2-dFileName.bz解压解压2:bunzip2FileName.bz压缩:未知压缩:未知.tar.bz解压:解压:tarjxvfFileName.tar.bz压缩:未知压缩:未知十二月 29,20222022/12/292.4Linux下常用命令下常用命令.tgz解压:解压:tarzxvfFileName.tgz压缩:压缩:tarFileName.tgzDirName.tar.tgz解压:解压:tarzxvfFileName.tar.tgz压缩:压缩:tarzcvfFi
11、leName.tar.tgzFileName.zip解压:解压:unzipFileName.zip压缩:压缩:zipFileName.zipDirName 十二月 29,20222022/12/292.4Linux下常用命令下常用命令-文本编辑命令文本编辑命令vi(重要)(重要)Command Mode(命令模式)1.这是执行vi后的缺省模式2.此时键盘输入当作命令3.命令有大小写之区分Input Mode(插入模式)1.使用 a、i、o、c、r、s 进入插入模式2.用户输入的任何字符都被vi当做文件内容保存起来,并将其显示在屏幕上3.按下 ESC 键即可回到 Command Mode十二月
12、29,2022Last Mode(末行模式)在 Command Line 按下:即可进入该模式1.用来进行保存文件、打开文档或环境的设定2.命令有大小写之分2.4Linux下常用命令下常用命令-文本编辑命令文本编辑命令vi十二月 29,2022十二月 29,2022vi的进入和内容输入进入:vi 文件名 输入文件内容 (进入输入模式)新增(append)a 从光标所在位置后面开始新增内容 A 从光标所在行最后面的地方开始新增内容。插入(insert)i 从光标所在位置前面开始插入内容 I 从光标所在行的第一个非空白字符前面开始插入资料。开始(open)o 在光标所在行下新增一行并进入输入模式。
13、O 在光标所在行上新增一行并进入输入模式。(命令模式)十二月 29,2022命令模式1 1、光标的移动、光标的移动h h 左移一个字符 l l 右移一个字符j j 下移一行 k k 上移一行w,Ww,W 跳至后一个字的开头(W忽略标点)b,Bb,B 跳至前一个字的开头(B忽略标点)e e 移动到后一个字的末尾 至本行第一个非空字符$至行尾 0 0 至行首H H 移动到当前窗口的第一列 M M 移动到当前窗口的中间列 L L 移动到视窗的最后一列)光标所在位置到下个句子的第一个字母 (光标所在位置到该句子的第一个字母 光标所在位置到该段落的最后一个字母 光标所在位置到该段落的第一个字母十二月 2
14、9,20221 1、光标的移动、光标的移动(续)续)nH 将光标移到屏幕的第 n 行 nL 将光标移到屏幕的倒数第 n 行CTRL-d 向下半页CTRL-f 向下一页 CTRL-u 向上半页 CTRL-b 向上一页 n-减号移动到上一行的第一个非空白字符,前面加上数字可以指定移动到以 上 n 行n+加号移动到下一行的第一个非空白字符,前面加上数字可以指定移动到以下 n 行命令模式十二月 29,20222 2、删除、删除x x 删除光标所在字符 X 删除光标前面的字符 s s 删除光标所在字符,并进入输入模式S S 删除光标所在的行,并进入输入模式 dd 删除光标所在的行 D 从光标位置开始删除
15、到行尾 d d与光标移动命令的组合与光标移动命令的组合命令模式十二月 29,20223 3、修改修改 r r 修改光标所在字符,r 后接着要修改的字符。如,rc 可以用字符“c”替换光标所指向的当前字符 R R 进入替换状态,新增内容会覆盖原先内容,直到按 ESC 回到命令模式下为止 cccc 修改光标所在行 C C 修改从光标位置到该行末尾的内容 c与光标移动命令的组合命令模式十二月 29,20224 4、复制和移动、复制和移动yy 复制当前行到内存缓冲区nyy 复制 n 行内容到内存缓冲区y与光标移动的组合p 将缓冲区的内容粘贴到光标的后面P 将缓冲区的内容粘贴到光标的前面另:在末行模式下
16、实现移动:n1,n2 m n3:把 n1到n2 行内容搬到第 n3 行后命令模式十二月 29,20225 5、搜索字符串、搜索字符串/pattern 移至下一个包含pattern的行?pattern 移至上一个包含pattern的行/往下重复查找?往上重复查找n 在同一方向重复查找N在相反方向重复查找/pattern/+n移至下一个pattern所在行后的第n行?pattern?-n 移至上一个Pattern所在行前的第n行6 6、其他、其他 u 撤销前一条命令的结果命令模式*.$/包含在查找字符串中,要用转义字符()十二月 29,2022末行模式1 1、文件的保存和退出、文件的保存和退出:w
17、 w 保存保存:q q 退出退出:w!w!强制保存强制保存:q!q!强制退出强制退出:wqwq 保存退出保存退出:wqwq!强制保存退出强制保存退出十二月 29,2022末行模式2、字符串的替换、字符串的替换 :s/str1/str2/:s/str1/str2/用字符串用字符串 str2 str2 替换行中首次出现的替换行中首次出现的字符串字符串 str1str1 :s/str1/str2/g :s/str1/str2/g 用字符串用字符串 str2 str2 替换行中所有出现替换行中所有出现的字符串的字符串 str1str1 :.,$s/str1/str2/g :.,$s/str1/str2
18、/g 用字符串用字符串 str2 str2 替换正文当前替换正文当前行到末尾所有出现的字符串行到末尾所有出现的字符串 str1str1 :1,$s/str1/str2/g :1,$s/str1/str2/g 用字符串用字符串 str2 str2 替换正文中所替换正文中所有出现的字符串有出现的字符串 str1str1 :g/str1/s/str2/g :g/str1/s/str2/g 功能同上功能同上 十二月 29,2022末行模式末行模式其他:其他::n :n 将光标移到第将光标移到第 n n 行行 编辑多个文件编辑多个文件vi file1 file2 vi file1 file2:n :n
19、编辑下一个文件编辑下一个文件:e filename:e filename 编辑指定文件编辑指定文件十二月 29,20222022/12/29gcc(GNUCCompiler)能将能将C、C+语言源程序、汇编语言程序和目标语言源程序、汇编语言程序和目标程序编译、连接成可执行文件。是程序编译、连接成可执行文件。是GNU推出的功推出的功能强大、性能优越的多平台编译器,可以在多种能强大、性能优越的多平台编译器,可以在多种硬体平台上编译出可执行程序,其执行效率与一硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高般的编译器相比平均效率要高20%30%。2.5GCC编译器编译器十二月 2
20、9,20222022/12/29gcc的执行过程的执行过程使用使用gcc由由C语言源代码文件生成可执行文件的过语言源代码文件生成可执行文件的过程要经历四个相互关联的步骤程要经历四个相互关联的步骤 1、预处理预处理(也称预编译,也称预编译,Preprocessing)对头文件(对头文件(include)、预编译语句(如)、预编译语句(如define等)进行分析等)进行分析预处理器预处理器cpp2、编译、编译(Compilation)将预处理后的文件转换成汇编语言将预处理后的文件转换成汇编语言,生成文件生成文件.s编译器编译器ccl3、汇编、汇编(Assembly)由汇编变为目标代码由汇编变为目标
21、代码(机器代码机器代码),生成,生成.o的文件的文件汇编器汇编器as4、连接、连接(Linking)连接目标代码连接目标代码,生成可执行程序生成可执行程序链接器链接器ld2.5GCC编译器编译器十二月 29,20222022/12/29gcc的执行过程(ESc)四个相互关联的步骤四个相互关联的步骤 源文件源文件.c1、.c源文件源文件2、生成、生成.i文件文件3、生成文件、生成文件.s4、生成、生成.o的文件的文件5、生成可执行程序、生成可执行程序31-E-E-S-S-c-c预处理预处理编译编译汇编汇编链接链接2.5GCC编译器编译器十二月 29,20222022/12/29GNUC的使用的使
22、用基本语法基本语法 gccoptionsfilenames说明:说明:在在gcc后面可以有多个编译选项,同时进行多个编译后面可以有多个编译选项,同时进行多个编译操作。操作。当你不用任何选项编译一个程序时,当你不用任何选项编译一个程序时,GCC将会建立将会建立(假定假定编译成功编译成功)一个名为一个名为a.out的可执行文件。的可执行文件。2.5GCC编译器编译器十二月 29,20222022/12/29gcc选项选项-o选项选项你能用你能用-o编译选项来为将产生的可执行文件指定一个文编译选项来为将产生的可执行文件指定一个文件名来代替件名来代替 a.out。例:例:gccocountcount.
23、c-c选项:告诉选项:告诉GCC仅把源代码编译为目标代码仅把源代码编译为目标代码,而取消连而取消连接的步骤。缺省时接的步骤。缺省时GCC建立的目标代码文件有一个建立的目标代码文件有一个.o的扩的扩展名。展名。例:例:gccctest2.c-E只运行只运行 C预编译器。预编译器。-S编译选项告诉编译选项告诉 gcc在为在为 C代码产生了汇编语言文件后代码产生了汇编语言文件后停止编译。停止编译。2.5GCC编译器编译器十二月 29,20222022/12/29-includefile功能相当于在代码中使用#include例子用法:gcc-o example example.c-include/us
24、r/include/stdio.h-I 用来指定头文件目录用来指定头文件目录./usr/include目录一般是不用指定的目录一般是不用指定的,但是如果头文件不在但是如果头文件不在/usr/include里我们就要用里我们就要用-I参数指定了,比如头文件放在参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上目录里,那编译命令行就要加上-Imyinclude参数了,如果不加你会得到一个参数了,如果不加你会得到一个“xxxx.h:Nosuchfileordirectory”的错误。的错误。2.5GCC编译器编译器十二月 29,20222022/12/29编译下列代码并运行下
25、列代码编译下列代码并运行下列代码#includeintmain()doublecounter;doubleresult;doubletemp;for(counter=0;counter4000.0*4000.0*4000.0/20.0+2030;counter+=(5-3+2+1)/4)temp=counter/1239;result=counter;printf(Resultis%lfn,result);return0;2.5GCC编译器编译器十二月 29,20222022/12/292.5GCC编译器编译器十二月 29,20222022/12/29Gdb(GNUdebugger)是)是GN
26、U开发组织发布的开发组织发布的一个强大的一个强大的Unix/Linux下的程序调试工具。下的程序调试工具。是一个命令行的调试器,但是一个命令行的调试器,但gdb具有比很多图形具有比很多图形化调试器更强大的功能。化调试器更强大的功能。可以调试各种程序,包括可以调试各种程序,包括C,C+,JAVA,PASCAL等等具有远程调试功能对嵌入式非常有用具有远程调试功能对嵌入式非常有用2.6GDB调试器调试器十二月 29,20222022/12/29Gdb主要可以完成下面任务:主要可以完成下面任务:(1)启动程序,并可以指定某些参数控制程序的)启动程序,并可以指定某些参数控制程序的运行运行(2)可让被调试
27、的程序在用户所指定的断点处停)可让被调试的程序在用户所指定的断点处停住住(3)当程序停止时,检查程序的状态)当程序停止时,检查程序的状态(4)动态地改变程序的参数,可以避过)动态地改变程序的参数,可以避过bug,继,继续查找其他的问题续查找其他的问题2.6GDB调试器调试器十二月 29,20222022/12/29gdbprogram也就是你的执行文件,一般在当前目录下也就是你的执行文件,一般在当前目录下2.6GDB调试器调试器十二月 29,20222022/12/29Gdb的命令可以使用的命令可以使用help命令来查看,命令来查看,help命令只是列命令只是列出出gdb的命令种类。的命令种类
28、。可以使用可以使用help命令,显示命令,显示class种类中的所有命种类中的所有命令。令。可以使用可以使用help命令,查看命令,查看command命令命令的帮助。的帮助。Gdb中输入命令时,可以不用输入命令的全称,只用输中输入命令时,可以不用输入命令的全称,只用输入命令的前几个字符就可以。入命令的前几个字符就可以。在在linux下,可以按两次下,可以按两次TAB键来补齐命令的全称。键来补齐命令的全称。Gdb中运行中运行Linux的的shell程序,如程序,如shell。2.6GDB调试器调试器十二月 29,20222022/12/293.3GDB调试器调试器十二月 29,20222022/
29、12/29加载要调试的执行文件加载要调试的执行文件file加载要调试的执行程序加载要调试的执行程序exec。2.6GDB调试器调试器十二月 29,20222022/12/293.3GDB调试器调试器查看源代码查看源代码list显示程序第显示程序第linenum行的周围的源程序行的周围的源程序list显示函数名为显示函数名为function的函数周围的源程序的函数周围的源程序list显示当前行后面的源程序显示当前行后面的源程序list-显示当前行前面的源程序显示当前行前面的源程序setlistsizen设置一次显示源代码的行数设置一次显示源代码的行数showlistsize查看当前查看当前lis
30、tsize的设置的设置2.6GDB调试器调试器十二月 29,20222022/12/29设置断点(设置断点(BreakPoint)break-进入指定函数时停住。进入指定函数时停住。break-在指定行号停住在指定行号停住2.6GDB调试器调试器十二月 29,20222022/12/29清除断点清除断点deletebreakpointsrange删除指定的断点,删除指定的断点,breakpoints为断点号,为断点号,range表示表示断点号的范围(如:断点号的范围(如:2-4)。如果不指定断点号,则)。如果不指定断点号,则表示删除所有的断点。其简写命令为表示删除所有的断点。其简写命令为d。比
31、删除更好的一种方法是比删除更好的一种方法是disable断点,断点,disable了断了断点,点,gdb不会删除,当还需要时,不会删除,当还需要时,enable即可,就即可,就好像回收站一样。好像回收站一样。2.6GDB调试器调试器十二月 29,20222022/12/293.3GDB调试器调试器设置观察点设置观察点观察点一般用来观察某个表达式的值是否变化了。观察点一般用来观察某个表达式的值是否变化了。watch为表达式(变量)为表达式(变量)expr设置一个观察点。一旦表达设置一个观察点。一旦表达式值有变化时,马上停住。式值有变化时,马上停住。infowatchpoints列出当前设置的所有
32、观察点列出当前设置的所有观察点2.6GDB调试器调试器十二月 29,20222022/12/29恢复程序运行和单步调试恢复程序运行和单步调试run(r)从程序开始运行程序从程序开始运行程序continue(c)恢复程序运行,直到程序结束,或是下一个断点到来。恢复程序运行,直到程序结束,或是下一个断点到来。step(s)单步执行,进入调用的函数的内部单步执行,进入调用的函数的内部next(n)单步执行,不会进入调用的函数内部单步执行,不会进入调用的函数内部finish(f)如果已进入了某函数,而想退出该函数返回到它的调用函数中如果已进入了某函数,而想退出该函数返回到它的调用函数中 2.6GDB调
33、试器调试器十二月 29,20222022/12/29查看运行时数据查看运行时数据print查看当前程序的运行数据。查看当前程序的运行数据。为格式。为格式。2.6GDB调试器调试器退出退出GDBquitorq退出退出GDB十二月 29,20222022/12/29练习练习1(1)键入键入vi,编辑一个新文件,编辑一个新文件gexam.c。其内容如下:。其内容如下:#includemain()inta,i=0;a=0;while(i10)a=a+2;printf(thevalueofa=%dn,a);sleep(1);i=i+1;2.6GDB调试器调试器十二月 29,20222022/12/29练
34、习练习1(2)保存退出保存退出exam.c编译编译exam.c。使用使用 gcc-oexamoexam.c使用使用 gcc-g-ogexamexam.c比较比较gexam与与 examo的大小,因为的大小,因为 gexam含有调试含有调试信息,所以信息,所以gexam比比 examo大。大。执行执行gexam与与examo执行执行examo键入键入./examo。这里。这里./表示当前目录表示当前目录执行执行gexam键入键入./gexam。2.6GDB调试器调试器十二月 29,20222022/12/29练习练习1(3)使用使用gdb调试程序调试程序(1)启动)启动gdb程序程序(gdb)g
35、db(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)whati
36、sa(9)执行下一个源程序行)执行下一个源程序行(gdb)next(10)从断点开始继续执行到下一个断点)从断点开始继续执行到下一个断点(gdb)continue(11)查看变量)查看变量a的值的值(gdb)printa,看看,看看a是否有变化是否有变化(12)不停地执行()不停地执行(gdb)continue,直到程序结束。,直到程序结束。(13)退出)退出gdbquit2.6GDB调试器调试器十二月 29,20222022/12/29练习练习2:程序功能为先显示一个字符串,再反序显示,使用:程序功能为先显示一个字符串,再反序显示,使用GDB找出其中的错误找出其中的错误并改正并改正#incl
37、ude#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调试器调试器十二月 29,20222022/12/29练
38、习练习2:程序功能为先显示一个字符串,再反序显示,使:程序功能为先显示一个字符串,再反序显示,使用用GDB找出其中的错误并改正找出其中的错误并改正intmain()charmy_string=helloLinux;my_print(my_string);my_print2(my_string);return;2.6GDB调试器调试器十二月 29,20222022/12/293.4make工具的使用工具的使用Make工具及工具及makefile文件概述文件概述Makefile基本知识基本知识Makefile应用应用 1)为单个文件编写)为单个文件编写makefile2)为多个文件编写)为多个文件
39、编写makefile3)使用不同目录的文件的)使用不同目录的文件的makefile的写法的写法十二月 29,20222022/12/292.7Make工具及工具及makefile文件概述文件概述GNUMake是程序自动维护工具是程序自动维护工具在大型的开发项目中,通常有几十到上百个的源文件,如果每在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入次均手工键入 gccgcc 命令进行编译的话,则会命令进行编译的话,则会 非常不方便。因非常不方便。因此,人们通常利用此,人们通常利用 make make 工具来自动完成编译工作。工具来自动完成编译工作。这些工作包括:这些工作包括:1
40、1)如果仅修改了某几个)如果仅修改了某几个 源文件,则只重新编译这几个源文件;源文件,则只重新编译这几个源文件;2 2)如果某个头文件被修改了,则重新编译所有包含该头文件的)如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。源文件。十二月 29,20222022/12/29Makefile基本知识基本知识基本基本makefilemakefile结构结构Makefile由一系列规则组成,规则格式如下:由一系列规则组成,规则格式如下:其中:其中:target需要由需要由 make工具创建的项目工具创建的项目,通常是目的文件和可执通常是目的文件和可执行文件。通常使用行文件。通常使用“目标(
41、目标(target)”一词来表示要创建的项目一词来表示要创建的项目。prerequisites 要创建的项目依赖于哪些文件。要创建的项目依赖于哪些文件。command 创建每个项目时需要运行的命令。创建每个项目时需要运行的命令。注:命令前面需要敲入注:命令前面需要敲入tab键,而不是空格!键,而不是空格!target:prerequisites依赖关系依赖关系command命令命令十二月 29,20222022/12/29Make工具及工具及makefile文件概述文件概述MakeMake及及makefilemakefile原理原理GNU makeGNU make的主要工作是读进文本文件的主要
42、工作是读进文本文件makefilemakefile。这些文件主要是。这些文件主要是有关那些文件(目的文件)是从哪些别的文件(依靠文件)中产有关那些文件(目的文件)是从哪些别的文件(依靠文件)中产生的,用什么命令来进行这个产生的过程。生的,用什么命令来进行这个产生的过程。有了这些信息,有了这些信息,makemake会检查磁盘上的文件,如果目的文件的时间会检查磁盘上的文件,如果目的文件的时间比至少它的一个依靠文件旧,比至少它的一个依靠文件旧,MakeMake将执行相应的命令,以便更新将执行相应的命令,以便更新目的文件。目的文件不一定是最后的可执行文件,它可以是任何目的文件。目的文件不一定是最后的可
43、执行文件,它可以是任何一个文件。一个文件。十二月 29,20222022/12/29Makefile基本知识基本知识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结束结束十二月 29,20222022/12/29Makefile基本知识基本知识实例说明实例说明从上面的例子注意到,第一个字符为从上面的例子注意到,第一个字符为
44、#的行为注释行的行为注释行。第一个非注释行指定第一个非注释行指定myprog为目标,并且依赖于为目标,并且依赖于foo.o和和bar.o文件文件。foo.o和和bar.o文件又各自有自己的依赖规则文件又各自有自己的依赖规则makefile中一般都有中一般都有clean规则,在重新编译之前删除以前生成规则,在重新编译之前删除以前生成的各个文件,此条规则没有依赖文件的各个文件,此条规则没有依赖文件使用使用make工具的执行工具的执行makefile的命令为:的命令为:make或或makemakefile)缺省文件名为当前目录下的缺省文件名为当前目录下的makefile或或Makefile或或 GN
45、Umakefile,也可以使用命令行参数,也可以使用命令行参数f指定文件名指定文件名:例如例如 makeffilename十二月 29,20222022/12/29Makefile基本知识基本知识实例说明实例说明如果没有如果没有“-f”参数,在参数,在Linux中,中,GNUmake工具在当前工作工具在当前工作目录中按照目录中按照GNUmakefile、makefile、Makefile的顺序搜索的顺序搜索 makefile文件。文件。通过命令行参数中的通过命令行参数中的target,可指定,可指定make要编译的目标,并且要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依
46、次编允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译译target选项中指定的目标文件。选项中指定的目标文件。如果命令行中没有指定目标,则系统默认如果命令行中没有指定目标,则系统默认target指向描述文件中指向描述文件中第一个目标文件。第一个目标文件。如如makemakeclean十二月 29,20222022/12/29Makefile基本知识基本知识Makefile变量变量环境变量:环境变量:(1)存储文件名列表。)存储文件名列表。(2)存储可执行文件名。)存储可执行文件名。(3)存储编译器标识。)存储编译器标识。(4)存储参数列表。)存储参数列表。比如我们利用比如我们利用ma
47、kefile变量把上面的变量把上面的makefile文件重写一遍。文件重写一遍。十二月 29,20222022/12/29Makefile基本知识基本知识Makefile变量变量使用环境变量后的使用环境变量后的makefile实例实例=makefile开始开始=OBJS=foo.o bar.oCC=gccCFLAGS=-Wall O gEXEC=myprog$(EXEC):$(OBJS)$(CC)$(OBJS)o$(EXEC)foo.o:foo.c foo.h bar.h$(CC)$(CFLAGS)c foo.c o foo.obar.o:bar.c bar.h$(CC)$(CFLAGS)ba
48、r.c o bar.o=makefile结束结束=十二月 29,20222022/12/29Makefile基本知识基本知识Makefile变量变量内部变量:内部变量:$-$-扩展成当前规则的目的文件名扩展成当前规则的目的文件名$-扩展成依靠列表中的第一个依靠文件扩展成依靠列表中的第一个依靠文件$-$-扩展成整个依靠的列表扩展成整个依靠的列表利用这些变量,可以把上面的利用这些变量,可以把上面的makefilemakefile写成:写成:十二月 29,20222022/12/29Makefile基本知识基本知识Makefile变量变量=makefile开始=OBJS=foo.o bar.oCC=
49、gccCFLAG=-Wall O gmyprog:$(OBJS)$(CC)$-o$foo.o:foo.c foo.h bar.h$(CC)$(CFLAG)c$-o$bar.o:bar.c bar.h$(CC)$(CFLAG)c$-o$=makefile结束=十二月 29,20222022/12/29Makefile应用应用为单个文件编写为单个文件编写makefile为多个文件编写为多个文件编写makefile使用不同目录的文件的使用不同目录的文件的makefile的写法的写法多个子模块的文件的多个子模块的文件的makefile写法写法十二月 29,20222022/12/29Makefile应
50、用应用为单个文件编写为单个文件编写makefile编写编写hello.c程序程序#include int main(void)printf(Hello world!n);return 0;十二月 29,20222022/12/29Makefile应用应用执行:执行:$viMakefile=makefile开始=#This is a sampleCC=gccall:hello.o$(CC)o hello hello.ohello.o:hello.c$(CC)c o hello.o hello.cclean:rm*.o hello=makefile结束=十二月 29,20222022/12/29M