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

下载本文档

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

文档简介

嵌入式Linux系统项目工程管理 课程安排 Linux项目工程管理的概念项目工程管理文件MakefileAutotool自动生成MakefileLinux开源项目嵌入式移植 软件工程维护问题 一个软件项目通常包含多个源码文件 每个源代码的编译和链接都要书写大量的命令 在一项目里 代码通常都有引用关系 因此需要指定谁先编译 谁后编译 甚至是更复杂的功能操作 重复编译时我们希望只对修改过的文件执行编译链接 加快编译速度 通过自动换编译脚本维护 1 将每个源文件需要用到的编译 链接命令写到shell脚本2 安装代码的引用关系 仔细安排编译 链接命令的先后顺序3 对于任何源码修改 重新执行编译脚本 对整个工程重新编译 shell编译脚本实例 1 工程结构 2 引用关系 myclass cmyclass c引用student1 c student2 c的接口函数显示班级中每个学生 shell编译脚本实例 3 编译脚本 build sh4 执行过程 每执行一次build sh 必须对整个工程的所有文件重新编译 链接一次 5 存在问题 如果工程有成千上万个文件 只改了其中的某个或者几个文件就让所有文件重新编译的时间开销是不可接受的 我们只需要对改动过的文件重新编译 重新链接成可执行文件即可 课程安排 Linux项目工程管理的概念项目工程管理文件MakefileAutotool自动生成MakefileLinux开源项目嵌入式移植 Makefile应运而生 Makefile就为解决上述一系统问题而创造的 可以把Makefile理解成是一种由make程序进行解释的一种特殊脚本 make是一个自动编译管理器 它能够根据文件时间戳自动发现更新过的文件而减少编译工作量 同时 它能读入Makefile的内容来执行大量的编译工作用户只需要一次性地将编译命令写进Makefile就可以永久性地使用make工程管理器完成编译 大大提高实际项目的工作效率几乎所有Linux下的项目编程都会涉及make工程管理 对我们十分重要 Makefile实例 1 Makefile文件 Makefile实例 2 执行编译 make makeall3 注意 Makefile文件本身不需要可执行权限 它是被make命令执行的4 Makefile可以增加一些有效的维护目标如 makeclean 删除编译过程文件 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进行编译maketarget1target2makeallmakecleanmakeinstallmakeuninstall Makefile的简化 一个软件的构造过程中 很多步骤是固定的 因此很多时候可以简化处理 这是Makefile最大优势在复杂项目里 为了简化Makefile的书写 往往会采用扩展写法 这些方法包括变量内置规则 自定义变量 1 递归展开方式定义VAR value递归展开方式定义的变量是在变量引用时进行替换的 这种方式在处理形如CFLAGS CFLAGS g的变量时可能导致无穷循环 最终导致溢出 2 简单扩展方式定义VAR value简单扩展方式变量的值在定义展开 并且只展开一次消除了上面无穷循环的问题 预定义变量 1 Make工程管理器维护了一些预定义变量 可以在Makefile中直接使用 1 CCC编译器的名称 默认值为cc 2 CFLAGSC编译器的选项 无默认值 3 LDFLAGSC链接器的选项 无默认值 如 使用数学函数库LDFLAGS lm 4 RM文件删除程序名称 默认值为rm f 5 AR归档维护程序的名称 默认值为ar 6 ARFLAGS归档维护程序的选项 无默认值 7 CXXC 编译器的名称 默认值为g 8 CXXFLAGSC 编译器的选项 2 在Makefile内可以使用自定义变量来覆盖预定义变量如 ARFLAGS crvsCC gcc 自定义与预定义变量示例 自动变量 对每一条Makefile规则 Make维护了一些自动变量 第一个依赖文件的名称 目标的完整名称 所有的依赖文件 以空格分开 不包含重复的依赖文件 不包含扩展名的目标文件名称 所有的依赖文件 以空格分开 并以出现的先后为序 可能包含重复的依赖文件 所有的依赖文件 以空格分开 这些依赖文件的修改日期比目标的创建日期晚 如果目标是归档成员 则该变量表示目标的归档成员名称 自动变量示例 内置规则 用GCC编译一个程序的步骤都是固定的 GNUmake会内置有一些规则 来简化这一些固定步骤1 隐式规则 1 隐式规则告诉make怎样使用传统技术完成任务 不必在Makefile中指定编译的具体细节 而只需要把目标文件列出来即可 2 make自动使用隐式规则来确定如何生成目标文件 3 最重要的隐式规则 所有的 file o 文件都可以自动由 file c 文件使用命令 CC CFLAGS cfile c ofile o生成 隐式规则示例 内置规则 2 模式规则 1 有时候多个文件具有相同的处理规则 这时候就要自定义模式规则 即相同模式的目标共用的规则 2 所有的 o文件依赖于对应的 c文件的模式规则 o c CC CFLAGS c o 3 模式规则会覆盖隐式规则 一般建议Makefile都用自己隐含规则来代替缺省规则 这样比较容易读懂 并且容易调整 模式规则示例 课程安排 Linux项目工程管理的概念项目工程管理文件MakefileAutotool自动生成MakefileLinux开源项目嵌入式移植 Autotools简介 较大项目Makefile都是相当复杂 手工编写有相当难度而且Makefile而且常常会受到自己的开发环境的限制 只要环境参数不同或者路径更改 可能Makefile就得跟着修改那么有没有为复杂工程自动生成Makefile的方法 Autotools 辅助生成Makefile的GNU工具应运而生 绝大部分开源项目都是用Autotools生成Makefile 因此Autotools是嵌入式Linux开发必须掌握的工具集 Autotools必要工具 autoconf 生成可以自动地配置软件源码包 用以适应多种UNIX类系统的shell脚本工具 最后生成可执行程序configureautomake 从Makefile am文件自动生成Makefile in的工具 configure程序使用Makefile in生成Makefilelibtool 方便生成各种程序库的工具 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 srcinc 指定需要处理的子目录 如果要处理多个子目录 以空格隔开 这里只有srcinc Autotools项目配置过程 ROOTDIR shell bin pwd 利用pwd取得当前路径exportINCLUDES 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 csrc2 c 对应 c文件名 产生静态库libname a需要的源文件 以空格隔开 Autotools项目配置过程 3 在inc目录增Makefile amEXTRA DIST inc1 hinc2 h 对应 h文件名 EXTRA DIST表示用来定义要额外打包的文件名称 Autotools项目配置过程 3 在给定目录及其子目录中搜索源文件 生成模板文件 autoscan4 准备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 产生配置文件configure6 生成Makefile in文件 automake add missing add missing选项会自动添加一些必要的脚本7 产生Makefile configure configure读入Makefile in生成Makefile 使用配置生成的Makfile 1 执行编译 产生可执行文件targetmake问题 automake默认的gcc编译选项为 Wall O2 g 怎么改为我们实际需要的编译选项 如不带优化选项 使用如下命令重新执行configure CFLAGS Wall g configure当然也可以直接顶层Makefile am中添加CFLAGS Wall g 使用配置生成的Makfile 2 将可执行文件target安装到系统目录makeinstall3 清除前一次编译的目标文件 o 库文件 a 可执行文件makeclean4 除了执行makeclean的工作外 还清除configure过程生成的文件 如Makefile makedistclean5 将源程序和相关文档打包成一个压缩文档以供发布makedist Configure配置选项 configure作为编译配置脚本 有大量选项可供不同编译需求 这些选项直接作用到最终生成的Makefile文件1 help查看所有选项2 prefix PEWFIX输入安装目录前缀 如 configure prefix usr local bin Configure配置选项 3 编译器选项 如 CFLAGS Wall g configureLDFLAGS Llibpath llibname static configureCC arm linux gcc configure4 host指定软件运行的系统平台如 嵌入式arm linux通常用 host arm linux configure host arm linux 课程安排 Linux项目工程管理的概念项目工程管理文件MakefileAutotool自动生成MakefileLinux开源项目嵌入式移植 移植 porting 是指把原来在A操作系系统上的运行程序改写成能在B操作系统上能运行的程序一般象很多应用程序本身是针对PC端上的服务器的设计 如果把它改写成在ARM Linux运行 就是一种移植移植很多时候是一种手工化的劳动 移植能否成功取决于开发者的经验 可参考google baidu上其他人的成功经验 在嵌入式领域 很多时候应用程序在开始设计时就有可移植的观念 如建立一个操作系统调用的封装层 这样在移植时会减少很多麻烦 例如跨平台SOCKET头文件sock h 什么是移植 一般情况下 不同Linux系统之间 如果有源码 只要调换一个编译器 gcc 即可重新在新的Linux系统 例如嵌入式Linux 上运行但是因为嵌入式Linux使用的库和环境与桌面Linux有一些差别因此对其移植往往需要改动源代码和makefileLinux是一个开源操作系统 GNU项目 www gnu org 内有很多基于Linux系统的开源应用软件嵌入式Linux应用移植指的是把开源应用源码移植的嵌入式Linux目标系统使用 嵌入式Linux移植 相对于RHEL5 Arm Linux主要不同是采用arm linux gcc进行编译 因此大部的移植都是修改Makefile 把其编译成嵌入式版本gcc arm linux gccar arm linux arstrip 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 要求 移

温馨提示

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

评论

0/150

提交评论