




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用GNU GCC创建BREW应用出处: /article/show.asp?id=542摘要:本文介绍了如何在Windows平台上安装设置用于BREW应用开发的GNU GCC编译器,并演示了使用GNU GCC创建BREW应用模块的一个实例。关键字:BREW,GNU GCC编译器,GNUDE,ARM,ADS。什么是BREW:BREW(Binary Runtime Environment for Wireless,无线二进制运行环境)是美国高通公司为无线数据服务提供的一整套端到端的解决方案。通过调用BREW SDK提供的API,开发者可以使用C/C+开发BREW应用。什么是GNU GCC:GNU GCC(GNU Compiler Collection,GNU编译器集合)是基于开源项目的广为使用的免费编译器集合,支持C、C+、Objective C、Chill、Fortran和Java等语言。这篇文章中我们讨论使用GNU GCC编译C/C+程序生成ARM目标代码。关于GNUDE:GNUDE(GNU Development Environment,GNU开发环境)是基于GNU GCC编译器集合的开发工具套件,集成了支持多种微处理器平台应用开发的模拟器和调试器,目前目标平台支持ARM7、ARM9和XScale,工作环境为Windows NT/2000/XP。为什么使用GNU GCC:目前所有支持BREW平台的手持终端都采用基于ARM的处理器,而开发者通常都是使用基于Intel架构的x86 PC作为开发平台,所以需要使用一种交叉编译器来生成ARM平台的目标代码。有两种交叉编译器可供选择:商业软件ADS(ARM Development Suite)和自由软件GNU GCC。作为商业软件的ADS比GNU GCC有很多优势:专业的技术支持,目标代码更可靠更优化,等等。可是评估版的ADS只能使用45天,高昂的注册费用令广大中小软件开发商望而却步。因此问题的关键是,免费的GNU GCC能否胜任我们的需要?就目前使用的情况看,答案是肯定的,许多使用GNU GCC编译的BREW应用已经成功运行在各种手机终端上。所以,让我们开始吧!准备所需工具包:gnude-arm-win.zip:在这里下载最新的GNUDE版本(72M左右)。GCCSupportForBREW.zip:请发信至索取。build_files.tar:请发信至索取。安装工具包:1.解压缩gnude-arm-win.zip至本地,例如c:gnude。2.解压缩GCCSupportForBREW.zip,拷贝GCCResolver.c至src目录(为BREW SDK安装路径,下同);拷贝BREWelf2mod.exe至bin目录,例如c:gnudebin。3.解压缩build_files.tar,拷贝make.exe和rm.exe至目录。设置环境变量:控制面板-系统-高级-环境变量-系统变量 将和bin(例如c:gnude;c:gnudebin)加入Path环境变量中。好了,你的GNU GCC已经准备运行了!一个实例:下面我们将以ExamplesWhiteBoard为例,演示如何使用GNU GCC编译程序生成ARM目标模块WhiteBoard.mod。拷贝build_files.tar中的whiteboard-gcc.mak至ExamplesWhiteBoard目录,进入DOS窗口,在WhiteBoard所在目录输入:make f whiteboard-gcc.mak就会生成WhiteBoard.mod目标文件。关于makefile的编写是初学者比较头痛的问题,这里简要介绍了一下makefile的写法,并给出了一个经过注释的makefile模板,稍微修改就可以用于任何BREW C/C+应用。使用make在开发软件时,开发者必须自行注意有哪些文件需要重新编译,随着项目规模的扩大,这件工作的强度会成几何级数增长,直至不可控制,而make的设计就是为了减轻这个负担,根据一定的规则编写makefile描述需要操作的步骤,make会自动完成相关的文件更新。对于软件开发人员来讲,需要操作的步骤就是指程序各模块间的依赖关系,make只要知道这种依赖关系就知道什么时候该编译链接哪些文件。在了解makefile写法之前,我们需要知道自己程序各模块间的依赖关系。图一将这种关系以树状结构图表示,解读的方式是由上往下看。例如我们要产生myprog,就必须要先产生a.o、b.o、c.o三个文件,而要产生a.o则必须先要有a.c和header.h两个文件。从另一个角度(由下往上看),当a.c被更改时,a.o就“过期”了,必须重新产生以得到最新版本的a.o;而因为a.o被更新了,所以应该重新链接产生myprog。这种连锁反应就是a.c和myprog间的依赖关系。同样的,b.c、c.c与myprog也都有类似的关系。Make是根据文件的保存时间来判断某个文件是否“过期”了。 myprog / | / | / | / | - 编译关系 / | a.o b.o c.o | | / | | - 链接关系 / | | a.c header.h b.c c.c (图一)根据图一写成的makefile如下:myprog: a.o b.o c.ogcc a.o b.o c.o o myproga.o: a.c header.hgcc c a.cb.o: b.cgcc c b.cc.o: c.cgcc c c.c注:表示TAB制表符,下同。makefile的格式:1注释:在makefile中,任何以“#”开头的文字都被看作注释,make在解释makefile的时候会忽略这些文字。2续接下行:在makefile中,如果一行不足以容纳该命令的时候,可以在该行的后面加一个反斜线“”表示下一行是本行的延续,两行应视为一行来处理。3宏定义:宏的格式为:=例如:CFLAGS = -o2 c D_DEBUGmake本身已有很多默认的宏,如果要查看这些宏的话,可以用make p命令。4规则:格式如下:: : 从上面的myprog示例可以看到,其makefile是由4个基本单元组成的,分别描述myprog、a.o、b.o、c.o四个target的depend和command。例如第一个基本单元应该解读成:myprog这个target是由a.o、b.o、c.o三个depend组成;要产生myprog的方式(command)为gcc a.o b.o c.o o myprog其他三个基本单元类似。有两点需要注意:1一个target可以由不同数目的构成部分,myprog的例子示范了一个到三个的情形,如果用到make更复杂的技巧,也有可能出现零个的情况。2command那行必须以开头,如果输入了空格而不是,执行时会报告“missing separator”错误。注释过的makefile模板#修改下一行为你的目标名称TARGET= AppNameEXETYPE=elfBINARY =binMODULE=mod#-# 在这里加入出$(TARGET).o之外其余的程序模块,可以为多个#-ADD_OBJS = ModName.o APP_OBJS =AEEModGen.o AEEAppGen.o GCCResolver.o $(ADD_OBJS) $(TARGET).o#-# 定义目标编译时符号# 指定编译动态模块#-DEFINES = -DDYNAMIC_APP#-#定义软件工具环境变量# GCCHOMEPATH应当设定为你的GNUDE安装路径。# ELF2MODTOOLPATH应当设定为BREWelf2mod.exe的安装路径#-GCCHOMEPATH = c:/gnudeGCCBINPATH = $(GCCHOMEPATH)/binELF2MODTOOLPATH = $(GCCHOMEPATH)/bin#-#修改这里来定位你的AEEAppGen.c & AEEModGen.c#-AEESRCPATH = ././src#-# 修改这里来定位你的BREW头文件#-AEEINCPATH = ././incGCC=$(GCCBINPATH)/arm-elf-gcc.exeLD=$(GCCBINPATH)/arm-elf-ld.exeELF2MODTOOL=$(ELF2MODTOOLPATH)/BREWelf2mod.exe#-# 编译器优化选项# -O0 取消优化. #-OPT=-O2END=-mlittle-endianTARG =-mthumbCODE =$(END) -fshort-enums -fno-builtin#-# 头文件搜索路径#-INC=-I$(AEEINCPATH) -I$(GCCHOMEPATH)libgcc-libarm-elfinclude -I$(GCCHOMEPATH)arm-elfinclude #-#库文件搜索路径#-LIBDIRS = -L$(GCCHOMEPATH)/lib/gcc-lib/arm-elf/3.3 -L$(GCCHOMEPATH)/arm-elf/lib#-# 处理器体系结构选项# 目前所有BREW手机都使用ARM 7t芯片#-CPU=-mcpu=arm7tdmi#-# ARM Procedure Call Standard (APCS) options# -fPIC sets posititon independent code. Other option: -fpic# -mthumb-interwork enables switching between ARM and Thumb code# -mapcs-frame runs on systems with the frame ptr. specified in the# APCS#-ROPI=INTRWK=-mthumb-interworkAPCS=-mapcs-frame $(ROPI) $(INTRWK)#-# 编译器输出选项# -c设置只有目标文件输出#-OUT=-c#-# 调试信息选项# -g 选项保留调试信息#-#DBG=-gDBG=#-# 编译开关定义#-CFLAGS0 =$(OUT) $(DEFINES) $(CPU) $(APCS) $(CODE) $(DBG)CFLAGS =$(CFLAGS0) $(INC) $(OPT) #-# 链接选项# -o指定输出文件名称#-LINK_CMD = -Ttext 0 -emit-relocs -entry AEEMod_Load -oLIBS = -lgcc -lsupc+ -lc#-# 链接开关定义#-LDFLAGS =$(LIBDIRS)#-# 默认目标#-default: $(TARGET).$(MODULE)#-# 所有目标#-all: $(TARGET).$(MODULE)$(TARGET).$(MODULE) : $(TARGET).$(EXETYPE)$(ELF2MODTOOL) $(TARGET).$(EXETYPE) $(TARGET).$(MODULE)$(TARGET).$(EXETYPE) : $(APP_OBJS)$(LD) $(LINK_CMD) $(TARGET).$(EXETYPE) $(LDFLAGS) $(APP_OBJS) $(LIBS) $(LINK_ORDER)#-# 清除所有自动创建目标#-clean:rm -f $(APP_OBJS) $(TARGET).$(EXETYPE) $(TARGET).$(MODULE)#-#目标文件依赖关系:#修改这里,加入你的依赖关系。#-$(TARGET).o:$(TARGET).cAEEAppGen.o:$(GCC) $(CFLAGS) -o AEEAppGen.o $(AEESRCPATH)/AEEAppGen.cAEEModGen.o:$(GCC) $(CFLAGS) -o AEEModGen.o $(AEESRCPATH)/AEEModGen.cGCCResolver.o: $(GCC) $(CFLAGS) -o GCCResolver.o $(AEESRCPATH)/GCCResolver.cModName.o: $(GCC) $(CFLAGS) -o ModName.o ./ModName.cAppName.o: ./AppName.c $(GCC) $(CFLAGS) -o AppName.o ./AppName.c注意事项:在BREW应用程序中不得使用全局或者静态变量。l目前只支持创建ARM-mode(non-thumbl mode)BREW二进制模块。MS VC和GNU GCC在实现上有差异,所以有些C/C+程序在模拟器上用MS VC可以编译通过,但是用GNUl GCC创建ARM目标代码时编译失败,这时需要根据编
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年国家电投集团所属国家核电招聘考试笔试试题(含答案)
- 2025年贵州两山文旅集团有限公司招聘考试笔试试题(含答案)
- 2025年贵阳市创业投资有限公司招聘考试笔试试题(含答案)
- 紧急人才补给服务创新创业项目商业计划书
- 量子磁力计在矿物成分创新创业项目商业计划书
- 汽车大数据分析平台创新创业项目商业计划书
- 营销数据分析创新创业项目商业计划书
- 农业保险与节水农业结合创新创业项目商业计划书
- 2025年深海矿产资源勘探技术深海地质构造解析报告
- 2025年物流行业物流配送机器人技术应用现状与市场前景分析
- 青少年运动员运动损伤的预防和处理
- 高中数学竞赛平面几何中几个重要定理
- 中建测评2024二测题库及答案
- 精准施肥技术的优化与创新
- 肺结核的个案护理
- 乒乓球裁判培训课件
- 铁道概论(第八版)佟立本主编
- 真心痛的护理常规课件
- 乡村振兴项目规划建设与运营方案
- 驾驶员服务外包合同范本
- 实际控制人证明书
评论
0/150
提交评论