嵌入式交叉编译环境.ppt

上传人:sccc 文档编号:5398577 上传时间:2023-07-03 格式:PPT 页数:91 大小:6.82MB
返回 下载 相关 举报
嵌入式交叉编译环境.ppt_第1页
第1页 / 共91页
嵌入式交叉编译环境.ppt_第2页
第2页 / 共91页
嵌入式交叉编译环境.ppt_第3页
第3页 / 共91页
嵌入式交叉编译环境.ppt_第4页
第4页 / 共91页
嵌入式交叉编译环境.ppt_第5页
第5页 / 共91页
点击查看更多>>
资源描述

《嵌入式交叉编译环境.ppt》由会员分享,可在线阅读,更多相关《嵌入式交叉编译环境.ppt(91页珍藏版)》请在三一办公上搜索。

1、2023/7/3,大连东软信息学院 嵌入式系统导论课程组,嵌入式系统导论,2023/7/3,第2章 嵌入式交叉编译环境,2023/7/3,交叉开发环境:宿主机调试通道目标机“在谁的上面编写运行在谁上的程序的问题”,2.1嵌入式交叉编译环境简介,2023/7/3,第2章 嵌入式交叉编译环境,2023/7/3,2.2 NFS服务,NFS服务可以使网络上的同为Linux或Unix系统主机共享文件系统。NFS可以将远程文件系统载入在本地文件系统下。远程的硬盘、目录和光驱都可以变成本地主机目录树中的一个子目录。载入后与处理自己的文件系统一样使用即可。不只方便,也节省了重复保存文件的空间、传输文件的时间及

2、网络带宽。,2023/7/3,NFS特点NFS系统也是使用C/S体系结构,就是有服务器端与客户端服务器端提供共享的文件系统,必须把文件系统输出(export)出去客户端则要把文件系统载入到自己的系统下使用NFS,需要在服务器端设置输出,在客户端设置载入,2.2 NFS服务,2023/7/3,NFS服务器端配置(1)关闭防火墙(2)配置共享目录-客户端主机IP范围(3)主机IP(4)启动NFS服务,2.2 NFS服务,NFS客户端(1)设置客户端IP地址(2)挂载共享目录,mount-t nfs 主机ip:共享目录 挂载点,注意事项:关闭防火墙,主机与客户端在同一ip段,2023/7/3,具体配

3、置步骤服务器端1)关闭防火墙,2.2 NFS服务,2023/7/3,2)配置NFS服务器,2.2 NFS服务,2023/7/3,2-1)设置共享目录和主机范围,2.2 NFS服务,2023/7/3,2-2)设置其他选项,2.2 NFS服务,2023/7/3,2.2 NFS服务,2-3)设置其他选项,2023/7/3,3)设置NFS服务器的IP,2.2 NFS服务,2023/7/3,4)启动NFS服务,2.2 NFS服务,2023/7/3,客户端1)配置ip,2.2 NFS服务,2023/7/3,2)挂载NFS,2.2 NFS服务,2023/7/3,第2章 嵌入式交叉编译环境,2023/7/3,

4、Samba服务可实现Windows和Linux不同系统间交换文件共享。,2.3 Samba服务,2023/7/3,具体设置步骤服务器端1)关闭防火墙(同NFS),2.3 Samba服务,2023/7/3,2)配置Samba服务器,2.3 Samba服务,2023/7/3,2-1)设置共享目录和访问权限,2.3 Samba服务,2023/7/3,2.3 Samba服务,2-2)设置共享目录和访问权限,2023/7/3,2.3 Samba服务,2023/7/3,2.3 Samba服务,2-4)服务器设置,2023/7/3,2.3 Samba服务,2-4)服务器设置,2023/7/3,3)配置Sam

5、ba服务器主机ip,2.3 Samba服务,2023/7/3,4)启动Samba服务,2.3 Samba服务,2023/7/3,客户端1)配置Windows 的IP只要和你开的服务器IP在同一网段就行,2.3 Samba服务,2023/7/3,2)在Windows上访问共享,2.3 Samba服务,2023/7/3,3)访问成功,2.3 Samba服务,2023/7/3,第2章 嵌入式交叉编译环境,2023/7/3,混合开发模式的必要:由于初学者对Linux系统不是很熟悉,通常会采用Windows下强大的编辑工具,通过共享再在Linux系统下进行编译、调试等工作。(1)VMware虚拟机设置共

6、享(2)SSH客户端软件(3)Windows下的文本编辑工具,2.4 Windows和Linux混合开发模式,2023/7/3,(1)VMware虚拟机设置共享-1,2.4 Windows和Linux混合开发模式,2023/7/3,(1)VMware虚拟机设置共享-2,2.4 Windows和Linux混合开发模式,解压缩文件 tar zxvf VMwareTools-5.0.0-13124.tar.gz C/home,安装文件 进入解压缩后的文件夹:cd vmware-tools-distrib/安装:./vmware-install.pl,2023/7/3,(1)VMware虚拟机设置共享

7、-3,2.4 Windows和Linux混合开发模式,设置共享,2023/7/3,(2)SSH客户端软件,2.4 Windows和Linux混合开发模式,SSH的英文全称:Secure ShellSSH把所有传输的数据进行加密,并且SSH客户端软件可将传输的数据进行压缩后再传输。(1)PuTTY(2)Secure Shell Client,2023/7/3,(3)Windows下的文本编辑工具,2.4 Windows和Linux混合开发模式,UltraEdit-32 Source Insight,2023/7/3,第2章 嵌入式交叉编译环境,2023/7/3,gcc(GNU C Compile

8、r)能将C、C+语言源程序、汇编语言程序和目标程序编译、连接成可执行文件。是GNU推出的功能强大、性能优越的多平台编译器,可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%30%。,2.5 GCC编译器,2023/7/3,gcc的执行过程 使用gcc由C语言源代码文件生成可执行文件的过程要经历四个相互关联的步骤 1、预处理(也称预编译,Preprocessing)对头文件(include)、预编译语句(如define等)进行分析预处理器cpp2、编译(Compilation)将预处理后的文件转换成汇编语言,生成文件.s编译器ccl3、汇编(Assembly)由

9、汇编变为目标代码(机器代码),生成.o的文件汇编器as4、连接(Linking)连接目标代码,生成可执行程序链接器ld,2.5 GCC编译器,2023/7/3,gcc的执行过程(ESc),四个相互关联的步骤源文件.c1、.c源文件2、生成.i文件3、生成文件.s4、生成.o的文件5、生成可执行程序,41,2.5 GCC编译器,2023/7/3,GNU C 的使用基本语法 gcc options filenames说明:在gcc后面可以有多个编译选项,同时进行多个编译操作。当你不用任何选项编译一个程序时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。,2.5 GCC编译器,202

10、3/7/3,gcc选项-o选项 你能用-o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out。例:gcc o count count.c-c选项:告诉GCC仅把源代码编译为目标代码,而取消连接的步骤。缺省时GCC建立的目标代码文件有一个.o的扩展名。例:gcc c test2.c-E 只运行 C 预编译器。-S 编译选项告诉 gcc 在为 C 代码产生了汇编语言文件后停止编译。,2.5 GCC编译器,2023/7/3,-include file功能相当于在代码中使用#include例子用法:gcc-o example example.c-include/usr/include/s

11、tdio.h-I 用来指定头文件目录./usr/include目录一般是不用指定的,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-Imyinclude参数了,如果不加你会得到一个“xxxx.h:No such file or directory”的错误。,2.5 GCC编译器,2023/7/3,第2章 嵌入式交叉编译环境,2023/7/3,Gdb(GNU debugger)是GNU开发组织发布的一个强大的Unix/Linux下的程序调试工具。是一个命令行的调试器,但gdb具有比很多图形化调试器更强大的功能。

12、可以调试各种程序,包括C,C+,JAVA,PASCAL等具有远程调试功能对嵌入式非常有用,2.6 GDB调试器,2023/7/3,Gdb主要可以完成下面任务:(1)启动程序,并可以指定某些参数控制程序的运行(2)可让被调试的程序在用户所指定的断点处停住(3)当程序停止时,检查程序的状态(4)动态地改变程序的参数,可以避过bug,继续查找其他的问题,2.6 GDB调试器,2023/7/3,gdb program也就是你的执行文件,一般在当前目录下,2.6 GDB调试器,2023/7/3,Gdb的命令可以使用help命令来查看,help命令只是列出gdb的命令种类。可以使用help命令,显示cla

13、ss种类中的所有命令。可以使用help命令,查看command命令的帮助。Gdb中输入命令时,可以不用输入命令的全称,只用输入命令的前几个字符就可以。在linux下,可以按两次TAB键来补齐命令的全称。Gdb中运行Linux的shell程序,如shell。,2.6 GDB调试器,2023/7/3,3.3 GDB调试器,2023/7/3,加载要调试的执行文件file 加载要调试的执行程序exec。,2.6 GDB调试器,2023/7/3,3.3 GDB调试器,查看源代码list 显示程序第linenum行的周围的源程序list 显示函数名为function的函数周围的源程序list 显示当前行后

14、面的源程序list-显示当前行前面的源程序set listsize n设置一次显示源代码的行数show listsize查看当前listsize的设置,2.6 GDB调试器,2023/7/3,设置断点(BreakPoint)break-进入指定函数时停住。break-在指定行号停住,2.6 GDB调试器,2023/7/3,清除断点delete breakpoints range删除指定的断点,breakpoints为断点号,range表示断点号的范围(如:2-4)。如果不指定断点号,则表示删除所有的断点。其简写命令为d。比删除更好的一种方法是disable断点,disable了断点,gdb不会

15、删除,当还需要时,enable即可,就好像回收站一样。,2.6 GDB调试器,2023/7/3,3.3 GDB调试器,设置观察点观察点一般用来观察某个表达式的值是否变化了。watch 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住。info watchpoints列出当前设置的所有观察点,2.6 GDB调试器,2023/7/3,恢复程序运行和单步调试run(r)从程序开始运行程序continue(c)恢复程序运行,直到程序结束,或是下一个断点到来。step(s)单步执行,进入调用的函数的内部next(n)单步执行,不会进入调用的函数内部finish(f)如果已进入了某函

16、数,而想退出该函数返回到它的调用函数中,2.6 GDB调试器,2023/7/3,查看运行时数据print 查看当前程序的运行数据。为格式。,2.6 GDB调试器,退出GDBquit or q 退出 GDB,2023/7/3,练习1(1)键入vi,编辑一个新文件gexam.c。其内容如下:#include main()int a,i=0;a=0;while(i10)a=a+2;printf(the value of a=%d n,a);sleep(1);i=i+1;,2.6 GDB调试器,2023/7/3,练习1(2)保存退出exam.c 编译exam.c。使用 gcc-o examo exam

17、.c 使用 gcc-g-o gexam exam.c比较gexam 与 examo的大小,因为 gexam含有调试信息,所以gexam比 examo大。执行gexam与examo 执行examo 键入./examo。这里./表示当前目录执行gexam 键入./gexam。,2.6 GDB调试器,2023/7/3,练习1(3)使用gdb调试程序(1)启动gdb程序(gdb)gdb(2)读入调试程序(gdb)file gexam(3)列出相应于正在执行的程序的原文件内容(gdb)list(4)在程序a=0;处设置一个断点(gdb)break 4(注:这里4 为程序a=0;所在程序的行号,若自己更改

18、)(5)在程序printf(“the value of a=%d n”,a);处设置一个断点(6)执行该程序(gdb)run(7)查看变量a的值(gdb)print a(8)查看变量a的类型(gdb)whatis a(9)执行下一个源程序行(gdb)next(10)从断点开始继续执行到下一个断点(gdb)continue(11)查看变量a的值(gdb)print a,看看a是否有变化(12)不停地执行(gdb)continue,直到程序结束。(13)退出gdb quit,2.6 GDB调试器,2023/7/3,练习2:程序功能为先显示一个字符串,再反序显示,使用GDB找出其中的错误并改正#in

19、clude void my_print(char*string)printf(The string is%sn,string);void my_print2(char*string)char*string2;int size,i;size=strlen(string);string2=(char*)malloc(size+1);for(i=0;i size;i+)string2size-i=stringi;string2size+1=0;printf(The string printed backward is%sn,string2);,2.6 GDB调试器,2023/7/3,练习2:程序功能

20、为先显示一个字符串,再反序显示,使用GDB找出其中的错误并改正int main()char my_string=hello there;my_print(my_string);my_print2(my_string);return;,2.6 GDB调试器,2023/7/3,第2章 嵌入式交叉编译环境,2023/7/3,3.4 make工具的使用,Make工具及makefile文件概述Makefile基本知识Makefile应用 1)为单个文件编写makefile 2)为多个文件编写makefile 3)使用不同目录的文件的makefile的写法,2023/7/3,Make工具及makefile

21、文件概述,GNU Make是程序自动维护工具在大型的开发项目中,通常有几十到上百个的源文件,如果每次均手工键入 gcc 命令进行编译的话,则会 非常不方便。因此,人们通常利用 make 工具来自动完成编译工作。这些工作包括:1)如果仅修改了某几个 源文件,则只重新编译这几个源文件;2)如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。,2023/7/3,Makefile基本知识,基本makefile结构Makefile由一系列规则组成,规则格式如下:其中:target需要由 make 工具创建的项目,通常是目的文件和可执行文件。通常使用“目标(target)”一词来表示要创建的项目。

22、prerequisites 要创建的项目依赖于哪些文件。command 创建每个项目时需要运行的命令。注:命令前面需要敲入tab键,而不是空格!,target:prerequisites 依赖关系 command 命令,2023/7/3,Make工具及makefile文件概述,Make及makefile原理GNU make的主要工作是读进文本文件makefile。这些文件主要是有关那些文件(目的文件)是从哪些别的文件(依靠文件)中产生的,用什么命令来进行这个产生的过程。有了这些信息,make会检查磁盘上的文件,如果目的文件的时间比至少它的一个依靠文件旧,Make将执行相应的命令,以便更新目的文

23、件。目的文件不一定是最后的可执行文件,它可以是任何一个文件。,2023/7/3,Makefile基本知识,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*.o myprogmakefile结束,2023/7/3,Makefile基本知识,实例说明从上面的例子注意到,第一个字符为#的行为注释行。第一个非注释行指定 myprog为目标,并且依赖于 foo.o和bar.o

24、 文件。foo.o和bar.o文件又各自有自己的依赖规则makefile中一般都有clean规则,在重新编译之前删除以前生成的各个文件,此条规则没有依赖文件使用make工具的执行makefile的命令为:make或make makefile)缺省文件名为当前目录下的makefile或Makefile或 GNUmakefile,也可以使用命令行参数f指定文件名:例如 make f filename,2023/7/3,Makefile基本知识,实例说明如果没有“-f”参数,在Linux中,GNU make 工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索

25、 makefile文件。通过命令行参数中的target,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件。如 make make clean,2023/7/3,Makefile基本知识,Makefile变量环境变量:(1)存储文件名列表。(2)存储可执行文件名。(3)存储编译器标识。(4)存储参数列表。比如我们利用makefile变量把上面的makefile文件重写一遍。,2023/7/3,Makefile基本知识,Makefile变量使用环境

26、变量后的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)bar.c o bar.o=makefile结束=,2023/7/3,Makefile基本知识,Makefile变量内部变量:$-扩展成当前规则的目的文件名$-扩展成依靠列表中的第一个依靠文件$-扩展成整个依靠的列

27、表利用这些变量,可以把上面的makefile写成:,2023/7/3,Makefile基本知识,Makefile变量=makefile开始=OBJS=foo.o bar.oCC=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结束=,2023/7/3,Makefile应用,为单个文件编写makefile为多个文件编写makefile使用不同目录的文件的makefile的写法多个子模块的文件的m

28、akefile写法,2023/7/3,Makefile应用,为单个文件编写makefile编写hello.c程序#include int main(void)printf(Hello world!n);return 0;,2023/7/3,Makefile应用,执行:$vi Makefile=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结束=,2023/7/3,Makefile应用

29、,为多个文件编写makefile有四个文件menu.c,music.c,picture.c,menu.h/*menu.c*/,#include#include“menu.h”int main(void)int choice;printf(-welcome you!-n);printf(*1 music!*n);printf(*2 picture!*n);printf(-have a choice!-n);scanf(d,switch(choice)case 1:music();break;case 2:picture();break;printf(Good Bye!n);return 0;,2

30、023/7/3,Makefile应用,为多个文件编写makefile/*music.c*/#include#include void music(void)printf(Listen to music!n);,2023/7/3,Makefile应用,为多个文件编写makefile/*picture.c*/#includevoid picture(void)printf(Have a look at picture!n);,2023/7/3,Makefile应用,为多个文件编写makefile/*menu.h*/void music(void);void picture(void);,2023/

31、7/3,Makefile应用,为多个文件编写makefile几个文件间的依赖关系,2023/7/3,Makefile应用,上面程序的makefile:=makefile开始=CC=gccall:menu.o music.o picture.o$(CC)menu.o music.o picture.o-o menumenu.o:menu.c menu.h$(CC)-c menu.c-o menu.omusic.o:music.c$(CC)-c music.c-o music.opicture.o:picture.c$(CC)-c picture.c-o picture.oclean:rm*.o

32、menu=makefile结束=,2023/7/3,Makefile应用,上面程序的makefile:实际上,可以用$代表目标文件,$代表源文件,于是可以将makefile写成这样:=makefile开始=CC=gccall:menu.o music.o picture.o$(CC)$-o menumenu.o:menu.c menu.h$(CC)-c$-o$music.o:music.c$(CC)-c$-o$picture.o:picture.c$(CC)-c$-o$clean:rm*.o menu=makefile结束=,2023/7/3,Makefile应用,上面程序的makefile:

33、由于各个文件的编译命令几乎没有什么差别,可以使用通配符%或*进一步简化:=makefile开始=CC=gccall:menu.o music.o picture.o$(CC)$-o menu%.o:%.c$(CC)-c-o$clean:rm*.o menu=makefile结束=,2023/7/3,Makefile应用,使用不同目录的文件的makefile的写法假设程序的目录结构如下:bin 存放生成的可执行文件(menu)obj 存放.o文件(menu.o,music.o,picture.o)include 存放.h文件(menu.h)src 存放源程序文件和makefile(menu.c,

34、picture.c,music.c),Makefile应用,=makefile开始=CC=gccall:./obj/menu.o./obj/music.o./obj/picture.o$(CC)-o./bin/menu$./obj/menu.o:./menu.c./include/menu.h$(CC)-o$-c$-I./include./obj/music.o:./music.c$(CC)-o$-c$./obj/picture.o:./picture.c$(CC)o$-c$clean:rm./bin/menu=makefile结束=,2023/7/3,Makefile应用,=makefile

35、开始=CC=gccSRC_DIR=./OBJ_DIR=./obj/BIN_DIR=./bin/INC_DIR=./includeall:$(OBJ_DIR)menu.o$(OBJ_DIR)music.o$(OBJ_DIR)picture.o$(CC)$-o$(BIN_DIR)menu$(OBJ_DIR)menu.o:$(SRC_DIR)menu.c$(INC_DIR)/menu.h$(CC)-I$(INC_DIR)-c-o$(OBJ_DIR)music.o:$(SRC_DIR)music.c$(CC)-c$-o$(OBJ_DIR)picture.o:$(SRC_DIR)picture.c$(C

36、C)-c$-o$clean:rm$(BIN_DIR)menu=makefile结束=,2023/7/3,Makefile应用,多个子模块的文件的makefile写法以上面的文件(多个目录)为例,将menu.c、music.c和picture.c分别放入src目录下的三个子目录menu、music和picture中,创造多模块环境需要写四个makefile,分别为于src、menu、music目和picture目录下,分别管理各自目录下的文件,2023/7/3,Makefile应用,src目录下的makefileCC=gccSRC_DIR=./OBJ_DIR=./obj/BIN_DIR=./bi

37、n/INC_DIR=./includeall:$(OBJ_DIR)menu.o$(OBJ_DIR)music.o$(OBJ_DIR)picture.o$(CC)$-o$(BIN_DIR)menuinclude$(SRC_DIR)menu/makefileinclude$(SRC_DIR)music/makefileinclude$(SRC_DIR)picture/makefile,2023/7/3,Makefile应用,src/menu目录下的makefile$(OBJ_DIR)menu.o:$(SRC_DIR)menu/menu.c$(INC_DIR)/menu.h$(CC)-I$(INC_DIR)-c-o$src/music目录下的makefile$(OBJ_DIR)music.o:$(SRC_DIR)music/music.c$(CC)-c$-o$src/picture目录下的makefile$(OBJ_DIR)picture.o:$(SRC_DIR)picture/picture.c$(CC)-c$-o$,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号