860 likes | 933 Views
工具链. 介绍部分 1b. 工具链. 本讲介绍 Symbian OS 的工具链和开发环境 强调的是提供工具的背景和目的 学习使用工具. 构建工具 (Build Tools). 理解 bldmake , bld.inf 和 abld.bat 基本用法 理解项目定义文件( MMP )的目的和典型语法 理解 Symbian OS 资源和文字本地化文件的角色. 构建工具. 为了构建 Symbian OS 程序,需要两个构建文件 : 组件描述文件 ( bld.inf ) 项目定义文件 ( projectname.mmp ). 构建处理.
E N D
工具链 • 介绍部分 1b
工具链 • 本讲介绍 • Symbian OS 的工具链和开发环境 • 强调的是提供工具的背景和目的 • 学习使用工具
构建工具(Build Tools) • 理解bldmake, bld.inf和 abld.bat基本用法 • 理解项目定义文件(MMP)的目的和典型语法 • 理解Symbian OS资源和文字本地化文件的角色
构建工具 • 为了构建Symbian OS程序,需要两个构建文件: • 组件描述文件 (bld.inf) • 项目定义文件 (projectname.mmp)
构建处理 • Symbian OS 有自己平台独立的构建文件格式 • 由bld.inf使用 • 以指示一个程序如何被构建 • bldmake工具 • 处理bld.inf组件描述文件 • 它包括关联的项目定义文件 • 产生一个批处理文件 - abld.bat
构建处理 • bldmake工具能够使用如下选项调用: • bldmake bldfiles 产生 abld.bat和关联的.make文件 • bldmake clean删除所有由bldmake bldfiles 产生的文件 • bldmake inf显示 bld.inf的基本语法 • bldmake plat显示支持的构建平台列表
构建处理 • 构建平台 • 表示各种目标平台和二进制格式 • 当abld.bat被调用 • 例如 ——用来构建代码 • 特定的平台(模拟器或硬件)由一个参数指定 • 最常使用的构建平台是: • WINSCW创建一个运行在Windows模拟器上的x86格式的二进制文件 • GCCE或ARMV5创建运行在手机硬件上的二进制代码 • - 分别使用GCCE和RVCT编译器构建
构建处理 • 当指定其中一个平台 • 以 abld.bat命令的一个参数 • 针对该平台的makefile文件将被创建和执行 • bld.inf的语法非常直接 • 它的主要目的就是列出项目定义文件 • 以及构建工具必须在构建之前导出到另一个位置的文件 • 最简单的例子是 • bld.inf只列举了要构建的项目定义文件 • 在关键字PRJ_MMPFILES后指定
bld.inf关键字 • 更加复杂的bld.inf文件 • 可以有很多部分组成 • 使用如下关键字: • PRJ_TESTMMPFILES • 为测试代码指定一个或者多个项目定义文件 • 测试代码可以通过调用abld test build而不是abld build构建
bld.inf关键字 • PRJ_EXPORTS • 列举一系列要从项目目录复制到另一个目录的文件 • 通常是 \epoc32下面的目录 • 可以调用abld export 来初始化导出操作 • 导出工作作为abld build命令的一部分会自动执行 • PRJ_TESTEXPORTS • 列举一系列要从项目目录复制到另一个目录的文件 • 通常是 \epoc32下面的目录 • 可以调用abld test export 来初始化导出操作 • 导出工作作为abld test build命令的一部分会自动执行
bld.inf关键字 • PRJ_PLATFORMS • 可用于列出组件支持的平台 • 如果没有指定 • abld命令使用缺省的集合 • 每个关键字 • 可以以任何顺序指定多次 • 除了这些关键字 • 扩展 makefile文件可用于构建任务 • 它不是有构建产生的makefile文件提供的 • 例如调用特定的工具或转换工具
构建处理 • 当对bld.inf做了改动 • 例如 –PRJ_EXPORTS下面添加了新的头文件 • bldmake bldfiles必须被重新调用 • 以产生新版本的abld.bat • 以及它所使用的构建用makefile文件 • abld.bat命令 • 能用不同参数从命令行调用 • 最常见的用法如下..
abld.bat命令行参数 • abld build • 组合许多其他参数 • export, makefile, library, resource, target和final • 以构建bld.inf文件中PRJ_MMP-FILES关键字下定义的MMP文件中指定的组件 • abld test build • 构建bld.inf 中PRJ_TESTMMPFILES下指定的组件
abld.bat命令行参数 • abld makefile • 使用Symbian OS makmake工具 • 为bld.inf中指定的每个工程创建makefile文件 .这些makefile文件之后被abld用于执行不同阶段的组件构建 • 每次构建组件,这个命令都会被调用 • makefile 文件总是要重新创建 • 无论对应的MMP文件是否修改
abld.bat命令行参数 • abld freeze • 冻结新的DLL导出函数到.def文件中 • abld clean • 删除由对应的abld命令创建的所有文件 • 编译时产生的所有中间文件 • 由linker产生的所有可执行文件和导入库 • abld reallyclean • 做 abld clean要做的事情 • 还删除由abld export 导出的文件 • 以及由abld makefile或 abld test对应命令产生的makefile文件
abld.bat命令行参数 • 每个命令 • 会针对bld.inf中 PRJ_MMPFILES下指定的所有工程都调用 • 通过使用abld XXX ,其中XXX是命令 • 对于PRJ_TESTMMPFILES 中指定的测试工程 • 则使用abld test XXX
工程定义文件和MMP 文件语法 • 一个工程定义文件 • 是一个描述构建一个工程所需细节的文本文件 • 通常是指工程的MMP 文件 • 这包括 • 工程的源文件 • 导入库 • 由#include预处理指令指定的被包含文件的位置 • 工程定义文件中的每一行语句都以一个关键字开头...
工程定义文件和MMP 文件语法 TARGET ASDExample.exe TARGETTYPE exe UID 0 0xF1101100 CAPABILITY NONE SOURCEPATH ..\src SOURCE ASDExampleAppUi.cpp SOURCE ASDExampleDocument.cpp SOURCE ASDExampleApplication.cpp SOURCE ASDExampleView.cpp SYSTEMINCLUDE \epoc32\include USERINCLUDE ..\inc SOURCEPATH ..\data STARTRESOURCE ASDExample.rss TARGETPATH \resource\apps HEADER END STARTRESOURCE ASDExample_reg.rss TARGETPATH \private\10003A3F\apps END // 通用的Symbian OS库 LIBRARY euser.lib efsrv.lib ... // 为清晰起见,忽略其他库文件 • 一个典型MMP文件中的主要关键字描述如下:
工程定义文件和MMP 文件语法 • TARGET • 指定要构建的文件的名称 - ASDExample.exe • TARGETTYPE • 指要构建名称的类型 • 本例中,是一个可执行应用程序 (EXE) • 最常用的Symbian OS 目标类型是 • DLL • EXE • PLUGIN (ECOM 插件)
工程定义文件和MMP 文件语法 • 其他支持的TARGETTYPEs 包括 • PDD–物理设备驱动器 • LDD–逻辑设备驱动器 • LIB - 静态库,其二进制代码直接包含在链接它的组件中 • EXEXP - 导出函数的可执行文件 • EPOCEXE和 EXEDLL • 在Symbian OS EKA1 中有时使用 • 在EKA2 中不再需要 • 因为它改进了进程模拟
工程定义文件和MMP 文件语法 • UID • 指定目标用以标识组件的三个唯一标识符的最后两个 • 目标有三个UIDs • 第一个值(UID1) 不需要给出 • 因为它由构建工具根据TARGETTYPE 自动提供 • 没有两个可执行文件 • 具有相同的UID3 值 • 它们的UID3值都必须从Symbian申请 • Symbian从一个中心数据库中分配
工程定义文件和MMP 文件语法 • SECUREID • 是本例中没有使用的另一个可选关键字 • 用于定义一个可执行文件的安全标识 (SID) • 用以标识该可执行文件 • SID • 可以通过工程MMP文件中的SECUREID 语句指定 • 如果它没有指定,则用UID3值 • 在没有指定UID3的MMP文件中 • SDI和UID3的值都用KNullUID (=0)
工程定义文件和MMP 文件语法 • VENDORID • 也是本例中没有使用的可选关键字 • Symbian OS v9.1 中新引入的 • 一个EXE 文件 • 可能包含一个厂商标识(VID) • 由VENDORID关键字指定 • 使用VID 来指明二进制代码的提供商 • 它不是必须使用的
工程定义文件和MMP 文件语法 • CAPABILITY • Symbian OS v9.1 中的新关键字 • 用于限制特定敏感系统API的使用 • 限制针对调用者,以一定的权限等级 • 为一个可执行文件分配的能力 • 列举在CAPABILITY关键字后 • 如果没有使用CAPABILITY • 赋予二进制代码的缺省能力是CAPABILITY NONE
工程定义文件和MMP 文件语法 • 可用能力的最大集合 • 可以指定为CAPABILITY ALL • 极少的组件会以这样的权限等级构建 • 一般而言 • 对于具有高权限等级的代码 • 其最大能力集合会是 CAPABILITY ALL -TCB
工程定义文件和MMP 文件语法 • SOURCEPATH • 指定SOURCE语句中列举的源文件和资源文件的位置 • 可以是相对位置 • 或者是绝对路径 • 该关键字 • 可以多次使用以指定不同的目录 • 也可以完全忽略,如果所有的源文件和MMP文件在同一个目录.
工程定义文件和MMP 文件语法 • SYSTEMINCLUDE • 指定代码中包含文件的目录 • 其中可以找到用#include<>指定的包含文件 • 所有全局头文件 • 应该存储在\epoc32\include中 • 或者其子目录中
工程定义文件和MMP 文件语法 • USERINCLUDE • 指定代码中的包含文件所在目录 • 其中可以找到由#include“”指定的包含文件 • 可以使用相对路径 • 或者绝对路径 • 由USERINCLUDE指定的目录 • 只是搜索头文件的三个位置之一 • 其他两个是: • 源文件目录 • SYSTEMINCLUDE目录.
工程定义文件和MMP 文件语法 • START RESOURCE … END • 指定一个资源文件 • 它包含了文字和用户接口元素的详情 • 这些关键字 • 替代了RESOURCE语句 • 它在Symbian OS v9.1以前的MMP文件中使用 • 一个应用程序可以有许多资源文件 • 每个都由START RESOURCE … END语句块分别指定 • 如果工程具有图形用户界面(GUI) • 至少需要一个资源文件
工程定义文件和MMP 文件语法 • START RESOURCE • 指示包含程序资源信息的语句块开始 • 资源文件 • 应该与MMP文件在同一个目录 • 或者在其他目录,该目录需要在SOURCEPATH语句中进行声明,并且该声明要直接在资源文件之前 • END • 指示语句块结束
工程定义文件和MMP 文件语法 • 本例中 • 第二个块指定了ASDExample应用程序的注册资源文件 • 该文件包含 • 应用程序启动器(application launcher)需要的非本地化信息 STARTRESOURCE ASDExample_reg.rss TARGETPATH \private\10003A3F\apps END
工程定义文件和MMP 文件语法 • 例如 • 应用程序名称 • UID 和属性 • 以及其他启动器需要的信息 • 例如 • 应用程序显示在系统菜单中的标题 • 以及另外独立定义的图标——便于本地化 • 这些定义的位置 • 由注册文件提供
工程定义文件和MMP 文件语法 • TARGETPATH • 指定编译后的资源(下一节介绍)的位置 • 在本例中 • ASDExample.rss资源被编译 • 在\resource\apps目录中产生输出 • 这是编译后资源文件的标准位置 • 第二个资源 • 注册文件被构建到 \private\10003a3f\apps中 • 它是注册信息的标准位置
工程定义文件和MMP 文件语法 • 由C++代码编译得到的二进制文件的 • 的构建位置 • 由关键字TARGETPATH指定 • 但是 • 在Symbian OS v9.1的安全平台中 • 所有的可执行代码必须从手机的\sys\bin目录运行 • 所有现在TARGETPATH关键字是多余的 • 除了构建资源文件到适当的位置
工程定义文件和MMP 文件语法 • HEADER • 是可选关键字 • 是一个资源头文件 (.rsg) 被创建到系统包含文件目录中 (\epoc32\include) • 它允许C++代码使用特定资源的名称 • 在关联的资源文件中定义的 • 本例中 • 产生的头文件 • 用于访问ASDExample.rss中指定的资源 • 注册资源文件不产生资源头文件
工程定义文件和MMP 文件语法 • LIBRARY • 列举应用程序需要的导入库 • 不需要给出路径 • 每个库声明语句可以包含多个库,它们由空格隔开 • 也可以使用多个LIBRARY声明
工程定义文件和MMP 文件语法 • EPOCSTACKSIZE • 该关键字用于将栈的大小增加 • 到关键字后面的十进制或者十六进制值 • 该选项应该小心使用 • 给一个应用程序分配额外的栈空间 • 减少其他应用程序的可用空间 • 如果一个应用程序需要大的栈 • 应该对它进行分析,以研究潜在的提高和优化的可能
工程定义文件和MMP 文件语法 • EPOCHEAPSIZE • 是另一个关键字——本例中没有使用 • 它可用于指定一个进程初始堆的最小和最大尺寸 • 以十进制或十六进制值 • 缺省的最小值是4 KB ,最大值是 1 MB • 最小尺寸 • 指定最初映射给堆使用的RAM • 该进程然后可以根据需要获得更多的对内存,直到达到最大值 • 这些值应该是页面大小(4KB)的整倍数
工程定义文件和MMP 文件语法 • EXPORTUNFROZEN • 是一个可选关键字 • 由DLL使用,它没有为导出一个完整的.def文件而冻结 • 导入库.lib被创建,并且所有的导出函数 • 包括未冻结的出现在导入库中
资源文件 • 资源文件 • 典型的用于指定GUI应用程序的用户界面元素 • 例如菜单条和对话框 • 它们也可以用于任何应用程序类型 • 资源文件也可用于定义: • Symbian OS应用程序的行为和功能 • 应用程序启动器所使用的应用程序的属性 • 应用程序使用的其他文字字符串和常量数据 • 例如对话框文字和错误信息
资源文件 • 为了对一组硬件保持平台独立性 • 资源说明是与每个目标平台的可执行文件分离的 • 资源被指定在 • 直接可读的文本文件中 • 由Symbian OS资源编译器独立编译成单独的二进制文件 • 这种分离 • 减少了应用程序在不同硬件平台移植时所需要的代价
资源文件 • 资源说明使用的语法 • 提供了对本地化很好的支持 • 通过允许文字和图形资源的分离 • 这不仅便于翻译 • 而且可以创建多语言应用程序 • 而不需要重新编译主程序的代码 • 应用程序的提供(发布)包括单个可执行文件 • 和许多语言特定的二进制资源文件
资源文件 • 资源文件 • 以Symbian OS特定的语法 写成文本文件 • 然后它们独自被编译 • 用命令行资源构建工具epocrc • 该工具将资源文件传递给C++预处理器 • 然后用Symbina OS资源编译器rcomp编译它 • 或者作为标准构建工具链的部分 • 从命令行或IDE编译
资源文件 • 资源文件 • 包含许多元素,它们都由一个Symbian OS资源关键字开头 • 例如 • RESOURCE • STRUCT • ENUM • 资源文件的名字具有后缀名.rss • 在.rss文件上调用资源编译器时 • 它产生两个输出...
资源文件 • 资源编译器产生两个输出 • 二进制资源文件.rsc • 一个位于\epoc32\include的.rsg头文件 • ——如果MMP在START RESOURCE … END块中指定了HEADER关键字 • .rsg文件 • 包含定义在.rss文件中的每个资源的#define声明 • 头文件可以被C++应用程序代码使用 • 以访问二进制资源文件中的元素 • 通过用#include预处理指令将其包含在代码中
资源文件 • 本地文件是一个文本文件,其命名为 • UIQ平台的后缀名为.rls • S60平台的后缀名为.loc • 直接包含在资源文件中 • 其他的Symbian OS 的头文件类型 • 可以用于资源文件的包括 • .hrh • 可以在C++和资源文件中共享的头文件 • .rh • 仅仅由资源文件使用的头文件
硬件构建 • 理解ARM C++ EABI是一种为嵌入式应用程序开发优化的工业标准 • 了解RVCT和GCCE编译器的基本信息,它们用于目标硬件构建 • 理解AMV5同时支持32位ARM和16位THUMB指令集,了解速度和大小的区别
EABI 标准 • Symbian OS 运行在本地ARM 处理器上 • 代码必须由支持嵌入式应用程序接口(Embedded Application Binary Interface, EABI)的编译器构建 • 这是一个运行在ARM环境的二进制代码接口标准 • 它使得由不同符合该标准的编译器产生二进制代码进行互操作 • 该标准被设计成 • 具有在内存使用和数据访问时间方面非常高效 • 提供不同厂商的编译器之间的互用性
EABI 标准 • Symbian OS 构建工具定义本地构建目标,它要么调用: • 一个适合版本的GNU 编译器集合 (GCC), 其目标在Symbian OS构建工具中被称为GCCE • 或者ARM’s RealView 编译器工具 RVCT 2.2, 其目标在Symbian OS构建工具中被称为ARMV5 • RVCT 用于 • Symbian 授权使用者如 Nokia 和 Sony Ericsson 以构建它们手机产品的ROM • GCCE 则由绝大多数的Symbian 开发者使用 • 它随着基于Symbian OS v9.1的任何手机产品的SDK一起交付 • 它也可以从Internet上直接下载
GCCE 目标编译器 • GCCE 是开源的GNU C++编译器的一个版本 • 它只用于构建应用程序 • 不能用于编译整个OS • 使用GCCE 可以通过 • 命令行 • 或者从开发IDE环境,如CodeWarrior 或 Carbide.c++中调用 • GCCE 构建目标 • 使用和ARMV5目标一样的.def文件格式 • 构建工具缺省在工程的\EABI目录中查找.def文件