嵌入式Linux系统项目工程管理.ppt_第1页
嵌入式Linux系统项目工程管理.ppt_第2页
嵌入式Linux系统项目工程管理.ppt_第3页
嵌入式Linux系统项目工程管理.ppt_第4页
嵌入式Linux系统项目工程管理.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式Linux系统项目工程管理,课程安排,Linux项目工程管理的概念 项目工程管理文件Makefile Autotool自动生成Makefile Linux开源项目嵌入式移植,软件工程维护问题,一个软件项目通常包含多个源码文件,每个源代码的编译和链接都要书写 大量的命令。 在一项目里,代码通常都有引用关系,因此需要指定谁先编译,谁后编译, 甚至是更复杂的功能操作。 重复编译时我们希望只对修改过的文件执行编译链接,加快编译速度。,通过自动换编译脚本维护,1、将每个源文件需要用到的编译、链接命令写到shell脚本 2、安装代码的引用关系,仔细安排编译、链接命令的先后顺序 3、对于任何源码修改,重新执行编译脚本,对整个工程重新编译,shell编译脚本实例,1、工程结构: 2、引用关系:myclass.c myclass.c引用student1.c、student2.c的接口函数显示班级中每个学生,shell编译脚本实例,3、编译脚本:build.sh 4、执行过程: 每执行一次build.sh,必须对整个工程的所有文件重新编译、链接一次。 5、存在问题: 如果工程有成千上万个文件,只改了其中的某个或者几个文件就让所有文件重新编译的时间开销是不可接受的,我们只需要对改动过的文件重新编译、重新链接成可执行文件即可,课程安排,Linux项目工程管理的概念 项目工程管理文件Makefile Autotool自动生成Makefile Linux开源项目嵌入式移植,Makefile应运而生,Makefile 就为解决上述一系统问题而创造的,可以把Makefile 理解成是 一种由make 程序进行解释的一种特殊脚本。 make是一个自动编译管理器,它能够根据文件时间戳自动发现更新过的文 件而减少编译工作量,同时,它能读入Makefile的内容来执行大量的编译 工作 用户只需要一次性地将编译命令写进Makefile就可以永久性地使用make工 程管理器完成编译,大大提高实际项目的工作效率 几乎所有Linux下的项目编程都会涉及make工程管理,对我们十分重要。,Makefile实例,1、Makefile文件,Makefile实例,2、执行编译:make/make all 3、注意:Makefile文件本身不需要可执行权限,它是被make命令执行的 4、Makefile可以增加一些有效的维护目标 如:make clean:删除编译过程文件,Makefile/Shell脚本比较,都是文本文件格式的脚本; 都可以执行Shell命令; 都可以定义变量,和条件控制语句。(使用格式上有差别),相同点:,解释器不同:Shell脚本是由对应Shell程序解释; 而Makefile是由make程序解释 格式不一样:Shell脚本以命令行为基本单位,而 Makefile以规则为基本单位 Shell脚本只要有执行权限即可直接执行,Makefile必须要用make来调用才行,本身不需执行权限,不同点:,Makefile的优势,在开发领域,Makefile还是有相当优势: 1、Makefile具有自动推导,判断源码依赖关系的功能 2、Makefile有可以使用隐含规则来简化makefile的编写 3、当然,Makefile使得大工程编译维护变得更快!,Makefile基本结构,需要由make工具创建的项目,通常是目标文件和可执行文件 通常使用“目标(target)”一词来表示要创建的项目 要创建的目标依赖于哪些文件 创建每个目标时需要运行的命令,每个命令之前必须有tab打头 通常都包含一些固定的伪目标: 如all、install、clean用作缺省编译,安装和清除文件 #打头表示注释行,makefile 中一般包含如下内容:,Makefile的规则,1、一个Makefile 可以看作是一系列规则的组合,规则是make进行处理的依据 2、规则的组成: (1)、需要由make工具创建的目标体(target),通常是可执行文件或目标文 件; (2)、要创建的目标所依赖的文件(dependency_files),通常是源文件、头 文件或者其他目标文件; (3)、创建每个目标体时需要运行的命令(command),可以是一行或多行 Shell命令。,目标名称 : 依赖对象 命令1 命令2 ,Make调用方法,make 默认执行当前目录下Makefile文件的第1个规则 make可以通用在命令行直接写target名称,用于一个或多个target进行编译 make target1 target2 make all make clean make install make uninstall,Makefile的简化,一个软件的构造过程中,很多步骤是固定的,因此很多时候可以简化处理, 这是Makefile最大优势 在复杂项目里,为了简化Makefile的书写,往往会采用扩展写法,这些方 法包括 变量 内置规则,自定义变量,1、递归展开方式定义 VAR = value 递归展开方式定义的变量是在变量引用时进行替换的。这种方式在处理形 如CFLAGS = $(CFLAGS) -g的变量时可能导致无穷循环,最终导致溢出。 2、简单扩展方式定义 VAR := value 简单扩展方式变量的值在定义展开,并且只展开一次消除了上面无穷循环 的问题。,预定义变量,1、Make工程管理器维护了一些预定义变量,可以在Makefile中直接使用 (1)CC C 编译器的名称,默认值为cc。 (2)CFLAGS C 编译器的选项,无默认值。 (3)LDFLAGS C 链接器的选项,无默认值。 如:使用数学函数库LDFLAGS = -lm (4)RM 文件删除程序名称,默认值为rm f (5)AR 归档维护程序的名称,默认值为 ar。 (6)ARFLAGS 归档维护程序的选项,无默认值。 (7)CXX C+ 编译器的名称,默认值为 g+。 (8)CXXFLAGS C+ 编译器的选项。 2、在Makefile内可以使用自定义变量来覆盖预定义变量 如:ARFLAGS = crvs CC = gcc,自定义与预定义变量示例,自动变量,对每一条Makefile规则,Make维护了一些自动变量。 $ 第一个依赖文件的名称。 $ 目标的完整名称。 $ 所有的依赖文件,以空格分开,不包含重复的依赖文件。 $* 不包含扩展名的目标文件名称。 $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含 重复的依赖文件。 $? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标 的创建日期晚。 $% 如果目标是归档成员,则该变量表示目标的归档成员名称,自动变量示例,内置规则,用GCC编译一个程序的步骤都是固定的,GNU make 会内置有一些规则。来 简化这一些固定步骤 1、隐式规则 (1)隐式规则告诉make怎样使用传统技术完成任务,不必在Makefile中指定编译的具体细节,而只需要把目标文件列出来即可 (2)make自动使用隐式规则来确定如何生成目标文件 (3)最重要的隐式规则:所有的“file.o”文件都可以自动由“file.c“文件使用命令$(CC) $(CFLAGS) -c file.c -o file.o生成.,隐式规则示例,内置规则,2、模式规则 (1)有时候多个文件具有相同的处理规则,这时候就要自定义模式规则,即相同模式的目标共用的规则 (2)所有的.o文件依赖于对应的.c文件的模式规则 %.o: %.c $(CC) $(CFLAGS) -c $ -o $ (3)模式规则会覆盖隐式规则,一般建议Makefile都用自己隐含规则来代替 缺省规则,这样比较容易读懂,并且容易调整,模式规则示例,课程安排,Linux项目工程管理的概念 项目工程管理文件Makefile Autotool自动生成Makefile Linux开源项目嵌入式移植,Autotools简介,较大项目Makefile都是相当复杂,手工编写有相当难度 而且Makefile而且常常会受到自己的开发环境的限制,只要环境参数不同或者路径更改,可能 Makefile就得跟着修改 那么有没有为复杂工程自动生成Makefile的方法? Autotools:辅助生成Makefile的GNU工具应运而生! 绝大部分开源项目都是用Autotools生成Makefile,因此Autotools是嵌 入式Linux开发必须掌握的工具集。,Autotools必要工具,autoconf: 生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,最后生成可执行程序configure automake:从Makefile.am文件自动生成Makefile.in的工具,configure程序使用Makefile.in生成Makefile libtool:方便生成各种程序库的工具,Automake流程图,1,3,2,4,5,6,7,Autotools项目配置过程,1、准备automake必需的配置文件Makefile.am (1)为顶层目录创建Makefile.am文件 AUTOMAKE_OPTIONS=foreign #指示automake代码级别,默认级别为gnu,GNU规定自由软件发布必 NEWS/README/AUTHORS/ChangeLog说明文件,这里将级别降为foreign,从而 避免准备这些文件. SUBDIRS=src inc #指定需要处理的子目录,如果要处理多个子目录,以空格隔开.这里只 有src inc,Autotools项目配置过程,ROOTDIR=$(shell /bin/pwd) #利用pwd取得当前路径 export INCLUDES=-I$(ROOTDIR)/inc #指定头文件所在路径,并导出供子目录Makefile.am使 bin_PROGRAMS=target #指定要产生的执行文件名 target_SOURCES=main.c 指定产生执行文件需要的源文件,如果有多个,以空格隔开 target_LDADD=$(ROOTDIR)/src/libname.a(利用src创建静态库) 或者 LIBS+=. 增加链接库,Autotools项目配置过程,(2)、在src子目录创建Makefile.am文件 noinst_LIBRARIES=libname.a (自己定义的静态库名) #在src子目录生成静态库libname.a,以便顶层目录主文件链接使用 libname_a_SOURCES(与库名对应)=src1.c src2.c(对应.c文件名) #产生静态库libname.a需要的源文件,以空格隔开,Autotools项目配置过程,(3)、在inc目录增Makefile.am EXTRA_DIST=inc1.h inc2.h (对应.h文件名) #EXTRA_DIST表示用来定义要额外打包的文件名称,Autotools项目配置过程,3、在给定目录及其子目录中搜索源文件,生成模板文件 ./autoscan 4、准备autoconf必需的配置文件configure.in 将configure.scan更名为configure.in,并对脚本进行如下修改 (1)修改AC_INIT宏,指定软件包名称/版本/bug报告地址 (2)加入automake必需的宏AM_INIT_AUTOMAKE() (3)屏蔽AC_CONFIG_HEADER宏 (4)由于我们将要把src目录内的源文件编译成静态库,需要加入AC_PROG_RANLIB宏,Autotools项目配置过程,5、生成configure文件 ./aclocal #为autoconf产生处理本地宏的aclocal.m4文件 ./autoconf #产生配置文件configure 6、生成Makefile.in文件 ./automake -add-missing #add-missing选项会自动添加一些必要的脚本 7、产生Makefile ./configure #configure读入Makefile.in生成Makefile,使用配置生成的Makfile,1、执行编译,产生可执行文件target make 问题:automake默认的gcc编译选项为-Wall -O2 -g,怎么改为我们实际需 要的编译选项(如不带优化选项)? 使用如下命令重新执行configure: CFLAGS=“-Wall -g“ ./configure 当然也可以直接顶层Makefile.am中添加CFLAGS=“-Wall -g“,使用配置生成的Makfile,2、将可执行文件target安装到系统目录 make install 3、清除前一次编译的目标文件(.o), 库文件(.a),可执行文件 make clean 4、除了执行make clean的工作外,还清除configure过程生成的文件(如Makefile) make distclean 5、将源程序和相关文档打包成一个压缩文档以供发布 make dist,Configure配置选项,configure 作为编译配置脚本,有大量选项可供不同编译需求,这些选项直 接作用到最终生成的Makefile文件 1、help 查看所有选项 2、-prefix=PEWFIX 输入安装目录前缀. 如: ./configure -prefix=/usr/local/bin,Configure配置选项,3、编译器选项,如: CFLAGS=“-Wall -g” ./configure LDFLAGS=“-L libpathl libname -static” ./configure CC=“arm-linux-gcc” ./configure 4、-host 指定软件运行的系统平台 如:嵌入式arm-linux通常用 -host=arm-linux ./configure -host=arm-linux,课程安排,Linux项目工程管理的概念 项目工程管理文件Makefile Autotool自动生成Makefile Linux开源项目嵌入式移植,移植(porting)是指把原来在A操作系系统上的运行程序改写成能在B操作系统上能运行的程序 一般象很多应用程序本身是针对PC端上的服务器的设计,如果把它改写成在ARM-Linux运行,就是一种移植 移植很多时候是一种手工化的劳动,移植能否成功取决于开发者的经验(可参考google/baidu上其他人的成功经验) 在嵌入式领域,很多时候应用程序在开始设计时就有可移植的观念,如建立一个操作系统调用的封装层,这样在移植时会减少很多麻烦:例如跨平台SOCKET头文件sock.h,什么是移植,一般情况下,不同Linux系统之间,如果有源码,只要调换一个编译器(gcc),即可重新在新的Linux系统(例如嵌入式Linux)上运行 但是因为嵌入式Linux使用的库和环境与桌面Linux有一些差别因此对其移植往往需要改动源代码和makefile Linux是一个开源操作系统,GNU项目( )内有很多基于Linux系统的开源应用软件 嵌入式Linux应用移植指的是把开源应用源码移植的嵌入式Linux目标系统使用,嵌入式Linux移植,相对于RHEL5,Arm-Linux主要不同是采用arm-linux-gcc进行编译,因此大部的移植都是修改Makefile,把其编译成嵌入式版本 gcc -arm-linux-gcc ar - arm-linux-ar strip - arm-linux-strip 大部分项目的Makefile可以简单换掉变量CC、AR、STRIP等就可实现移植,简单项目移植,Makefile移植示例,简单项目移植,Configure开源项目移植,复杂项目的移植主要是指autoconf工具生成configure配置脚本的项目,绝大部分开源项目用这样形式发布 这些项目的Makefile需要通过执行configure配置脚本生成,configure主要做二件事 检测当前环境是否支持编译这一软件 生成Makefile 在进行嵌入式移植前先了解要软件怎么运行的和运行原理 绝大部分软件在X86下用configure都会一次性通过 这样先在X86环境下编译运行,测试通过后再考虑移植到目标板,Configure开源项目移植,1、confgure是生成Makefile工具,在使用,,一定要用configure help查看其选项,查看是否支持CC、CFLAGS等环境变量的支持 (1)如果是直接在执行configure时加入工具链支持 CC=arm-linux-gcc ./configure (2)检查configure 是不是支持 -host 选择 如是则使用-host=arm-linux来让脚本来修改 ./configure -host=arm-linux 如果不是则直接运行configure,生成makefile后手工修改,移植madplay到开发板,1、要求:移植开源madplay项目到开发板,使它能在开发板上播放mp3歌曲 2、移植前准备: (1)、需要如下文件:madplay-0.15.2b.tar.

温馨提示

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

评论

0/150

提交评论