本文详解 MTK 的编译过程,并会根据我的理解来更新。阅读上文对本文的一些文件和术语 会有很好的帮助。 导读: Comp.mak 完成模块编译连接,生成 bin Gsm2.mak 主编译文件,完成 clean,remake,new 等工作 XXX_GPRS.mak 客户私有的配置,根据客户的不同,而设定不同的配置文件 Option.mak 工程中的基本配置及宏定义文件 Verno_XXX.bld 版本文件 Custom.bld 要保证在客户版本中都使用相同的配置的地方要写在这里,这个里面的一 些文件不能被改变 第一步: 1.Make.bat 命令首先调用 ChgFileMode.bat,将编译过程中需要用到的文件的只读属性修 改为可读写,再调用 make2.pl。 2.Make2.pl 的主要工作就是匹配 gsm2.mak 的参数,然后通过命令 system("${makeCmd} -f${makeFolder}${myMF} -r -R CUSTOMER=$custom PROJECT=$project $action");来调用 gsm2.mak。 具体解析出来就是 make -f make\gsm2.mak -r –R CUSTOMER=工程名 PROJECT=gprs new|update|remake 第二步:整个过程如图 Gsm2.mak Option.mak XXX_GPRS.mak REL_CR_MMI_GPRS.mak USER_SPECIFIC.mak 1.在 Gsm2.mak 文件的开始处调用了 option.mak 文件。 2.Option.mak 又将 make\$(strip $(CUSTOMER))_$(strip$(PROJECT)).mak 文件包含进来, 这个模式匹配结果为:make 目录下,工程名称_GPRS.mak,如 K500GSD_GPRS.mak。 3. 在 $(strip $(CUSTOMER))_$(strip$(PROJECT)).mak 文件中又调用了 REL_CR_MMI_$(strip$(PROJECT)).mak 文件,这个文件模式具体被解析为 make 目录下的 REL_CR_MMI_GPRS.mak 文件。 REL_CR_MMI_GPRS.mak 这个文件定义了哪些文件需要加入到编译目录中。 其中定义了 MMI 部分的编译目录为 MMIDIR = plutommi。 在变量 CUS_REL_BASE_COMP 中定义了资源的编译目录: CUS_REL_BASE_COMP += $(strip $(MMIDIR))\mmi $(strip $(MMIDIR))\mtkapp $(strip$(MMIDIR))\tool $(MMIDIR)\WIN32FS CUS_REL_BASE_COMP += $(strip$(MMIDIR))\Customer\CustomerInc \ $(strip $(MMIDIR))\Customer\Customize \ $(strip $(MMIDIR))\Customer\CustResource\$(strip $(MMI_VERSION))\ $(strip $(MMIDIR))\Customer\debug \ $(strip $(MMIDIR))\Customer\Images\GameImages \ $(strip $(MMIDIR))\Customer\Images\decoder \ $(strip $(MMIDIR))\Customer\Res_MMI \ $(strip $(MMIDIR))\Customer\ResGenerator \ $(strip $(MMIDIR))\Customer\ResourceDLL \ $(strip $(MMIDIR))\Customer\Resources \ $(strip $(MMIDIR))\Customer\Audio 客户的资源需要编译如下文件:CUS_REL_SRC_COMP += mmiresource mtkapp gdi_arm plutommi vendorapp 图片名称为:CUS_REL_BASE_COMP += $(strip$(MMIDIR))\Customer\Images\$(strip $(MMI_PROJ))$(strip$(MAIN_LCD_SIZE)),可解析为如: plutommi\customer\images\K500GSD176X220 REL_CR_MMI_$(strip $(PROJECT)).mak 其中CUS_REL_OBJ_LIST 这个变量存储了连接过程中所需要的文件名称 4.make\$(strip $(CUSTOMER))_$(strip$(PROJECT)).mak 文件的功能。 CUSTOM_OPTION 定义了所有需要编译进去的功能模块的宏。 COMPLIST 变量的功能: ifeq ($(strip $(RTOS)),NUCLEUS) COMPLIST = nucleus nucleus_int nucleus_ctrl_code nucleus_critical_data Endif 如果操作系统为 NUCLEUS,那么 COMPLIST 为后面的值,COMPLIST 为所要编译的 文件列表,里面存放了很多*.inc 文件,展开后就变为 config\include stacklib\include adaptation\include kal\include 等等 5. option.mak 文件的在后面调用了 make\USER_SPECIFIC.mak 如果使用 CPU 为 ARM,则编译工具目录为如下定义 ifeq ($(strip $(COMPILER)),ADS) DIR_ARM = c:\progra~1\arm\adsv1_2 DIR_ARM := $(strip $(DIR_ARM)) DIR_TOOL = $(DIR_ARM)\bin DIR_ARMLIB = $(DIR_ARM)\lib DIR_ARMINC = $(DIR_ARM)\include Endif 连接打包工具等为如下几个: DIR_TOOL := $(strip $(DIR_TOOL)) LINK = $(DIR_TOOL)\armlink.exe # Linker ASM = $(DIR_TOOL)\armasm.exe # ARM assembler LIB = $(DIR_TOOL)\armar.exe # Library tool BIN_CREATE = $(DIR_TOOL)\fromelf.exe # Binary tool 下面这段代码告诉我们需要用什么编译工具来编译 ifeq ($(strip $(COMPILER)),ADS) ifeq ($(strip $(COMPILE_MODE)),INST16) CC = $(DIR_TOOL)\tcc.exe # Thumb Mode(16bits), use tcc CC32 = $(DIR_TOOL)\armcc.exe # ARM Mode(32bits), use armcc CPPC = $(DIR_TOOL)\tcpp.exe # Thumb Mode(16bits), use tcc CPPC32 = $(DIR_TOOL)\armcpp.exe # ARM Mode(32bits), use armcc else ifeq ($(strip $(COMPILE_MODE)),INST32) CC = $(DIR_TOOL)\armcc.exe # ARM Mode(32bits), use armcc CPPC = $(DIR_TOOL)\armcpp.exe # ARM Mode(32bits), use armcc else CC = $(DIR_TOOL)\tcc.exe # Default tcc CC32 = $(DIR_TOOL)\armcc.exe # ARM Mode(32bits), use armcc CPPC = $(DIR_TOOL)\tcpp.exe # Thumb Mode(16bits), use tcc CPPC32 = $(DIR_TOOL)\armcpp.exe # ARM Mode(32bits), use armcc endif endif endif ifeq ($(strip $(PLATFORM)),MT6223P) AFLAGS := -g -littleend -cpu ARM7EJ-S Endif COMMINCDIRS 变量在先包含了基本功能模块的 inc 目录后再包含如下文件 COMMINCDIRS += $(DIR_ARMINC) $(CUSTOM_COMMINC), 6.Option.mak 中定义了一些附加功能模块的编译模式(是否被编译,被编译成什么样 的结果),比如说蓝牙,UART3,WIFI,USB,WAP 等等,还有一些编译器的设置。 我们的版本号和 Scat 文件被定义在这个变量中:5056L SCATTERFILE = custom\system\$(strip$(BOARD_VER))\scat$(strip $(PLATFORM)).txt VERNOFILE = make\Verno_$(CUSTOMER).bld .bin 文件的名称设置在这个变量 TARGNAME = $(CUSTOMER)_$(strip$(SUB_BOARD_VER))_$(PROJECT)_$(strip $(PLATFORM))_$(strip$(CHIP_VER)) TST_DB := $(strip $(TSTDIR))\database_classb 然后被包含到 Option.mak 文件中来,include $(strip$(VERNOFILE))。 7.Gsm2.mak 文件中 new 执行的指令 new : cleanall cmmgen mmi_feature_check asngen codegen asnregen operator_check_lite update update 所执行的指令 update : cleanlog cleanbin mcddll_update codegen resgen cksysdrv remake remake 所执行的指令 remake : mcp_check cleanlog cleanbin genverno libs $(BIN_FILE) done resgen 用来编译资源文件:Res_XXX.c (echo CUSTOM_OPTION = $(foreach def,$(BOARD_VER) $(PLATFORM) $(LCD_MODULE) $(EXT_CAM_MODULE)$(CMOS_SENSOR),-D "$(def)") \>$(MMIDIR)\customer\resGenerator\custom_option.txt) 首先将 CUSTOM_OPTION 重定向到 custom_option.txt 中 (type make\~cus_opt.tmp >>$(MMIDIR)\customer\resGenerator\custom_option.txt) 使用tools\strcmpex.exe 生成~cus_opt.tmp, ~tgt_opt.tmp,~inc.tmp 三个文件 将~cus_opt.tmp 重定向到 custom_option.txt 中 (@del $(MMIDIR)\mmi\TargetOption.txt) &\ (copy /Y make\~tgt_opt.tmp $(MMIDIR)\MMI\TargetOption.txt) 再将TargetOption.txt 更新一下,将~tgt_opt.tmp 重定向到 TargetOption.txt 中 (type make\~inc.tmp >$(MMIDIR)\customer\resGenerator\custom_include.tmp) 再将~inc.tmp 重定向到 custom_include.tmp 中, 执行replace_project_name.pl 文件,编译 Res_XXX.c 再执行 ResGenerator_HW.bat,编译资源文件。 8.Remake 中的编译过程是在 libs 中完成的 目标依赖:libs: cleanlib startbuildlibs $(COMPLIBLIST) Cleanlib 在这个依赖中做的动作是清掉上次生成的.bin,.elf,.lis 等文件,接着清掉需要 重新来生成的.lib 文件。$(COMPLIBLIST)这个依赖就是我们需要重新生成的.lib 文件。 .lib 文件的依赖关系:%.lib: 在这个依赖关系中所做的动作是设置编译器,链接器以及这个过程的参数等其他信息, 然后将这些信息输出到:~compbld.tmp 临时文件中。 (tools\make.exe -fmake\comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* >$(strip $(COMPLOGDIR))\$*.log) \ 调用了 make 命令来执行 comp.mak 文件,并且可以看到> $(strip$(COMPLOGDIR))\$*.log 该语句将执行 comp.mak 文件时产生的信息存放在当前编译部分的.log 文件中,通常看 编译信息的比如 custom.log 等就是该中类型的文件。 依赖关系:update_lib: $(TARGLIB) $(TARGLIB) : $(COBJS) $(CPPOBJS) $(AOBJS) $(ARMOBJS) $(TARGLIB)依赖很多.c 和.obj .c.obj: @echo Compiling $< ... @tools\strcmpex.exe $(ACTION) remake e $(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS) $(CINCDIRS) -o $(COMPOBJS_DIR)/$@$< @tools\strcmpex.exe $(ACTION) remake n $(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS) $(CINCDIRS) $(MD) -o$(COMPOBJS_DIR)/$@ $< @if exist $(*F).via tools\warp.exe $(*F).via @if exist $(*F).via $(CMPLR) $(VIA) $(*F).via @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d perl.\tools\pack_dep.pl $(FIXPATH)\$(*F).d >$(RULESDIR)\$(COMPONENT)_dep\$(*F).det @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d del /f /q$(FIXPATH)\$(*F).d >nul @if exist $(*F).via del /f /q $(*F).via 要生成.o 依赖于.c 文件,如果我的.c 文件经过更新,那么该.o 就需要重新生成,该.c 就 需要重新来编译。 @tools\strcmpex.exe $(ACTION) remake e$(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS)$(CINCDIRS) -o $(COMPOBJS_DIR)/$@ $< @tools\strcmpex.exe $(ACTION) remake n $(*F).via $(CINTWORK) -c $(CFLAGS) $(CDEFS) $(CINCDIRS) $(MD) -o$(COMPOBJS_DIR)/$@ $< 有两个编译环节,针对不同的编译动作,两者的不同点在于中间有个$(MD)编译选项, 在有该选项的时间编译的时候就会生成依赖关系文件.d。 @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d perl.\tools\pack_dep.pl $(FIXPATH)\$(*F).d >$(RULESDIR)\$(COMPONENT)_dep\$(*F).det 在这个的语句中有$(FIXPATH)\$(*F).d >$(RULESDIR)\$ (COMPONENT)_dep\$(*F).det 该动作又将.d 文件作为.pl 文件的参数,执行该 perl 文件后将结果输出放在.det 文件中。 @if not $(ACTION)==remake if exist $(FIXPATH)\$(*F).d del /f /q$(FIXPATH)\$(*F).d >nul 然后又执行这个语句,将.d 文件删除。 在make 文件中可以看到-include$(RULESDIR)\$(COMPONENT).dep 在查看各个.o 的依赖关系的时间要查看该.dep 文件来决定是否需要来重新编译生成 该.o。 如果新添加了.h 文件又没有来更新.dep 文件就可能导致该.o 查找依赖时没有依赖该.h。 不去更新该.o。 @if exist $(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib \ (copy /z $(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib $(subst/,\,$(TARGLIB))) &\ ($(LIB) -r $(TARGLIB) $(COMPOBJS_DIR)/*.obj) \ else \ ($(LIB) -create $(TARGLIB) $(COMPOBJS_DIR)/*.obj) 在生成了.o 文件后在.lib 的依赖中可以看到($(LIB) -r$(TARGLIB) $(COMPOBJS_DIR)/*.obj) 该语句将生成的.o 文件打包成.lib 库文件。 连接过程:$(BIN_FILE): 最后完成编译:done: # ----------------------------- # Clean temporary files in make directory # ----------------------------- @echo Cleaning make\~*.tmp files ... @if exist make\~*.tmp \ del make\~*.tmp @echo Done. @perl tools\time.pl -n 清掉临时文件,打出 done 信息,最后打出时间标签。 --------------------------------------------------------------------------------------- 本文编写的目的主要是从整体上理解 MTK 的编译过程,以便较快的处理编译中遇到的问题, 同时为以后可能的优化编译过程提供参考。 2. 简介 MTK 的编译过程主要是在 windows 命令行下通过 Makefile 文件执行相应的 perl 脚本或 c 程 序,将资源包生成 c 源程序,并与相应模块的 c 程序.o,.lib 或.obj 的中间代码,最终生成在 手机上使用的.bin 文件和在模拟器上使用的 mmiresource.dll 资源文件。 3. 编译环境 A. 编译工具和辅助工具 ADS1.2 ADS1.2_update_848.exe MSYS 版本:1.0.10 MinGW 版本:3.1.0 Gcc-core-3.3.1 Gcc-g++-3.3.1 ImageMagick 版本:6.3.6 Q16 7-zip 版本:3.13 注意:按照联发科技的要求,最好上述软件采用建议的版本,否则可能会出现异常 情况,导致不能正常编译。 B. 编译环境搭建 按默认路径安装 ADS1.2,并安装 848 补丁包 按默认路径安装 Perl 按默认路径安装 7_zip 安装 MinGW 先按默认路径安装 MinGW 安装包,然后解压 gcc-core、gcc-g++的压缩包,讲解压后的两个 文件夹复制到 MinGW 安装路径下。 安装 MSYS 安装 ImageMagick,注意: 按默认提示安装到 Select Additional Tasks 时,所有的选择全取消,后面再按默认安装。 复制 7z.exe 拷贝..\7_Zip\7z.exe 至..\plutommi\Customer\ResGenerator,并改名为 7za.exe。 复制 MinGW 拷贝..\MinGW 至..\Tools\MinGW。 复制 MSYS 拷贝..\msys\1.0 至..\Tools\MSYS。 复制 ImageMagick 拷贝..\ImageMagick-6.2.5-Q16 文件夹下全部文件 至 ..\plutommi\Customer\ResGenerator 目录下 设置 make.exe 改名 mingw32-make.exe(..\Tools\MinGW)为 make.exe,并放在 tools 目录下。 C. 编译环境检查 检查第三方软件安装情况 如果确认全部安装,可跳过此步。 将 custom3rdParty.pl 文件拷贝到本机,修改 4$sevenZipPath = "C:\\Progra1~1\\7-Zip"; 5$MinGWPath = "C:\\MinGW"; 6$MSYSPath = "C:\\MSYS"; 然后运行在 Tools\chk_env.exe 检查 windows 环境变量 检查 MTK 中 Makefile 变量是否正确 打开..\make\option.make,检查关于 ADS 编译器的路径设置 ifeq ($(strip $(COMPILER)),ADS) DIR_ARM = c:\adsv1_2 DIR_ARM := $(strip $(DIR_ARM)) DIR_TOOL = $(DIR_ARM)\bin DIR_ARMLIB = $(DIR_ARM)\lib DIR_ARMINC = $(DIR_ARM)\include Endif D. 结束 现在可以执行 MAKE 了,例如 Make customer_name gprs new_modis Make CUSTOMER_NAME gprs new E. 搭建编译环境的另一种方法 正确安装 A 中所述软件后,配置 custom3rdParty.pl 中变量,用该批处理文件自动配置剩余工 作。 F. 搭建编译环境的一种捷径 当已经配置好一个 MTK 工程,需要在另一个工程中搭建编译环境时,有一种便捷的方法, 步骤如下: 假设已配置好的工程 MAUI.A,待配置的是 MAUI.B; 备份 MAUI.B 的 tools 目录,如改名为 tools_new; 复制 MAUI.A 的 tools 目录至 MAUI.B 的目录下; 用 MAUI.B 原来的 tools 目录下所有文件覆盖当前的 tools 目录,如复制 tools_new 下所 有文件至 tools 下; 复制 MAUI.A 下 plutommi/Customer/ResGenerator/7za.exe 和 convert.exe 至 MAUI.B 下的 plutommi/Customer/ResGenerator。 4. 编译命令与文件 MTK 编译分资源的编译和代码的编译。 1) 资源的编译 a) 在如下的情况下,需要重新编译资源: 修改了字符串资源文件(Ref_list.txt)、字库文件(FontRes.c,L_**.h)、MMI 配置文件 (MMI_featuresPLUTO.h)等,这些文件位于 ..\plutommi\Customer\CustResource\PLUTO_MMI\ ; 修改了 MMI 资源装载配置文件,这些文件位于 ..\plutommi\Customer\CustResource\PLUTO_MMI\Res_MMI 目录下,这个目录下都是 Res_*.* 文件,是各个 AP 或模块的资源装载文件,包括菜单、图片和字符串资源的装载配置; 注意:Cust*.*文件是资源编译生成的,不能手动修改。 b) 编译方法 进入..\plutommi\Customer 目录,执行 remakeResource.bat。若是在模拟器上使用,则还需要 在 VC 环境下 build 一下,就可以看到效果了。 c) 与资源编译相关的文件 ResGenerator_HW.bat 在编译手机目标板工程时,有“new”,“resgen”等选项时,自动调用; ResGenerator.bat 手机 PC 模拟器工程中,添加新资源后,需要手动调用; remakeResource.bat 手机 PC 模拟器工程中,只替换图片或更新字符串等情况下,需要手动调用; res_gen.txt 资源编译的 log 文件,在 build 目录下; Makefile ..\plutommi\Customer\ResGenerator\Makefile 此文件是资源装载预编译程序的 Makefile; PopulateRes.c ..\plutommi\MMI\Resource\PopulateRes.c 执行资源装载,主体是函数 PopulateResData(), mtk_resgenerator.exe 在执行时会调用该函数; MMIDataType.h ..\plutommi\mmi\Inc\MMIDataType.h 定义 AP 的 ID 范围。 2) 代码的编译 A. 编译命令 命 令 说 明 Clean 清除所有的目标文件、库文件和日志文件,保留目录结构 New 清除并重新编译所有的文件 主要完成工作 gsm2.mak cleanall cmmgen mmi_feature_check asngen codegen asnregen operator_check_lite update Update 扫描资源、代码的改变,有改变的重编,无改变的不编 主要完成的工作 gsm2.mak cleanlog cleanbin mcddll_update codegen resgen cksysdrv remake Remake 不扫描资源,只扫描代码的改变,有改变的重编,无改变的不编 主要完成的工作 gsm2.mak mcp_check cleanlog cleanbin genverno libs $(BIN_FILE) done B. 编译相关的文件 编译用到的文件主要放在 make 文件夹中。各个文件的简要说明如下: 文件名 说 明 Gsm2.mak 编译过程中主要执行的 make 文件,这个文件从命令行获得编译参数,做出相应的处理。它 定义了各个参数的执行过程,包括:new、remake、update 等。以及调用其它 perl 或 c 程序 生成目标文件。 Option.mak 定义了编译环境中用到的工具及相关的目录,根据大的编译开关定义了小的编译和链接选 项。 XXX.lis XXX 模块的.c 文件 如 plutommi\MMI\MyApp\MyAppSrc\MyAppSrc.c XXX.pth XXX 模块的.c 文件存放的路径 如 plutommi\MMI\MyApp\MyAppSrc XXX.def XXX 模块用到的编译开关,当 XXX 模块引用其它模块中在编译开关下定义的变量、函数 或宏时,就需要将这个编译开关加进来。 XXX.inc XXX 模块用到的头文件路径,需要将 XXX 模块引用的头文件及,头文件引用的头文件的 路径均要包含进来。 如 plutommi\MMI\MyApp\MyAppInc XXX_GPRS.mak 定义了需要编译的模块列表、编译中包含文件和生成文件的路径,定义 trace 的头文件路径, 全局的编译开关,用户的一些编译选项,最后定义了编译路径和目录。用户可以在这个文件 中定义配置。 Comp.mak 编译和集成模块源文件,编译生成库文件。构建目标代码依赖列表,设置每个模块的编译路 径及编译选项,设置生成目标 lib 的路径,设置生成 obj 的路径。 ~buildinfo.tmp 包含了在 Gsm2.mak 和 Option.mak 中用到的项目和平台名称。 ~compbld.tmp 包含了编译每个模块时的编译信息。 目标文件 生成的目标文件为.bin 文件,位于..\build\proj 目录下面,build 目录为生成的一个目录。 Log 文件 Log 文件同.bin 文件一样,也是位于 build 目录下,如果编译出错,可以在命令行中看到出 错的模块,然后到 build 目录下找对应的 Log 文件。 MT6225r 目录 包括了每个模块的依赖文件(由 mak 产生的.dep)。 MT6225o 目录 包含所有生成的 obj 文件和 lib 文件。 C. 文件命名规则 一般来说 MMI 程序在 plutommi\mmi 或者 mtkapp 下面,程序源文件及头文件命名有一定的 规律。 以工具箱模块为例,有三个相关目录。 Organizer 程序总目录 OrganizerInc 头文件目录 OrganizerSrc 源文件目录 在 OrganizerSrc 下创建源程序文件 Ebook2.c 在 OrganizerInc 下创建程序头文件 EbookProt.h EbookDefs.h EbookTypes.h EbookGprot.h 下面介绍每个文件的作用: **Src.c/**.c 本程序的主源程序 **Gprot.h 用来放本程序的所有函数声明,但此头文件是被别的程序所加载的,也就是说此文件所申明 的都是对外接口; **Gtype.h 用来放本程序所需的类型、结构、常量宏定义,此头文件同时被别的程序所加载; **Gdcl.h 包括被其它程序调用的全局变量定义; **Gexdcl.h 包括全局变量的声明,该头文件被别的程序所加载; **Prot.h 用来放本程序的所有函数声明,但此头文件只被本程序的源程序所加载; **Dcl.h 定义仅被本程序所调用的全局变量; **ExDcl.h 包括全局变量的声明,但此头文件只被本程序的源程序所加载; **Types.h 用来放本程序所需的类型、结构、常量定义; **Def.h 用来放本程序的资源 ID 定义; *.* 也可以自己定义程序的命名规则。 5. 配置编译选项 XXX_GPRS.mak 是用户配置文件,用户可以通过修改该文件配置编译选项。 1) 增减编译的模块 牵涉到 XXX_GPRS.mak 中的两个变量: COMPLIST 列出所有可以被编译成.lib 库文件的模块。 当在 COMPLIST 中增加编译的模块时,注意要在 make 下相应的目录中创建相应 的.lis,.inc,.path,.def 文件。 CUS_REL_MTK_COMP 列出所有只提供.lib 库文件的模块。 这些库文件要位于../mtk.lib 中。 2) 将含有源文件的模块以库文件的形式编译 从 COMPLIST 中去除该模块; 将该模块加入 CUST_REL_MTK_COMP; 将.lib 库文件拷贝至../mtk.lib 中; 删除 make 下相应的模块目录。 3) 配置编译 MoDIS MoDIS 作为 MTK 软件开发的重要工具,常常被使用。但是由于在 PC 端与手机端不可避免 存在一定的区别,因此在编译 MoDIS 时,其配置选项有一些与手机端编译存在一定的区别。 在配置好手机端编译的基础上,相应 MoDIS 的配置还牵涉到: CreateMoDIS.ini Module.ini CreateMoDIS.pl 以下分别介绍这三个文件 a) CreateMoDIS.ini MoDIS 的全局配置,有 7 个部分配置编译: GLOBAL_SETTING 变量 disbale_libs 关闭 MoDIS 编译中不需的手机端模块,例如 bootloder 模块,此模块在手 机端上用于引导系统,但是在 MoDIS 上,由于并不是真实的目标板环境,因此该模块需要 取消。 变量 enable_libs 增加 MoDIS 编译中所独有的模块,例如 modis_fs,由于采用了模拟的文件 系统,因此在 disbale_libs 中加入 fs 模块后,在 enbale_libs 上加入 modis_fs。 ENABLE_INC_PATH/ DISABLE_INC_PATH 增加或减少头文件的搜索路径,其中 global 为全局路径,其他为相应模块的路径。 ENABLE_OPTION/ DISABLE_OPTION 增加或减少宏定义,其中 global 为全局宏,其他为相应模块或文件的宏。 ENABLE_FILE/ DISABLE_FILE 增加或减少相应模块的文件。 b) Module.ini MoDIS 目录下各模块都有.ini 文件,通过此类文件,用户可以修改相应模块编译时的头文件 搜索路径、宏定义选项。 c) CreateMoDIS.pl 编译 MoDIS 的批处理文件,在修改一些模块,如增加国笔时需要修改。 6. 常见编译错误 1) mtk_resgenerator.exe 不能正常运行。可能是 ResGenerator 文件夹中的某些文件有错 误。一个原因是在 ResGenerator 文件夹中缺少 temp.rgb 这个文件,并且不能自动生成。 2) 240X320 屏的 Font_res.c 文件的错误,因为打开了中文字体的编译开关,只需要将 mmi_featurespluto.h 文件中__MMI_LANG_SM_CHINESE__的编译开关关闭即可。 3) 出现以下错误,"plutommi\mmi\FunAndGames\FunAndGamesSrc\Game.c", line 349: Error: C2455E: array [0] found "plutommi\mmi\FunAndGames\FunAndGamesSrc\Game.c", line 350: Error: C2455E: array [0] found 因为默认的 240X320 屏幕打开的关于游戏的编译开关下没有游戏,所以需要打开 mmi_featurespluto.h 文件中的__MMI_GAME_VSMJ_240x320__编译开关。 4) 现象:mmiresource 模块生成错误: "plutommi\Customer\custresource\custimgmapext.c", line 31: Error: C2456E: undeclared name, inventing 'extern int MAX_IMAGE_IDS' "plutommi\Customer\custresource\custimgmapext.c", line 31: Serious error: C2958E: illegal in constant expression_r: non constant 'MAX_IMAGE_IDS' plutommi\Customer\custresource\custimgmapext.c: 0 warnings, 1 error, 1 serious error 原因:改变了屏幕大小后,128X160 目录下的图片资源有问题。 解决办法:更换 128X160 目录下的图片资源,重新编译此模块。 5) 现象:Free clusters are NOT enough . Check ckSysDrv.log for detail ! Tools\make.exe: *** [cksysdrv] Error 1 解决办法:删除掉\custom\system\CCDH26_05C_BB 目录下的 custom_EMI.c custom_EMI.h flash_opt.h 三个文件。 6) 现象:在新加模块的.c 文件中引用一个 b.h,产生 b.h 中的 aaa 变量没有定义的错误, 具体错误如下: 原因:没有包含定义 aaa 变量的头文件 a.h。 解决办法:在 include b.h 之前 include a.h 7) 现象:"plutommi\Customer\custresource\CustImgDataHW.h", line 19361: Serious error: C2934E: duplicate definition of '________CUSTOMER__IMAGES__EMPTYIMAGE_BMP' 原因: 解决办法:删掉 CustImgDataHW.h 这个文件重新编译 8) 现象:在链接 bin 文件时,出现以下错误: Error: L6218E: Undefined symbol custom_setAdvEMI (referred from bootarm.obj). 原因:custominfo.pl 文件没有修改,默认只打开 CCDH26_05C_GPRS.mak 一个文件,并不 打开其它定义编译开关的文件,导致 custom 模块中的有些文件没有编译,所以一些变量在 最后链接时显示未定义。 解决办法:修改 custominfo.pl 文件。 9) 现象:编译某个模块,出现错误: Error: L6218E: Error: C2933E: type disagreement for 'mmi_phb_info_entry_list' 原因:调用 mmi_phb_info_entry_list 函数时传递的参数不正确,或者是函数 mmi_phb_info_entry_list 在调用时还未定义。 解决办法:修改 custominfo.pl 文件。 10) 现象:编译时出现字符串未定义的错误, enum_list.h:2046: error: `STR_ENTERTAINMENT_EXPLAIN_WOMANKNOWLEDGE' undeclareere (not in a function) 原因:可能是编译开关没打开,或者是正在使用 excel 表,readexcel.c 中没有添加相关的头 文件。还有一种可能是在使用这个字符串 ID 的模块的 make 底下的.inc 文件中没有将定义这 个字符串的头文件路径加上。还要注意防止头文件引用的宏定义是不是重复。 11) 现象:执行 ResGenerator.bat 时到输出第一份记录文本文件时当机,并且每次都过不去。 原因:安装了 Windows 的更新程序导致的,具体的可能是因为两个原因,一是安装了 MSN 最新版的补丁,也有可能是安装了 SP3 补丁所致。
还剩12页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

lorry_717

贡献于2011-09-15

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf