在WinCE系统中,当我们完成了相关的开发和系统定制工作以后,会编译WinCE系统,最后生成NK.bin和NK.nb0。
过程如图:
从图中可以看出,整个编译都是通过调用Blddemo.bat来实现的,实际上也是这样,编译WinCE就是用Blddemo.bat,只不过后面可以跟不同的参数。编译阶段和系统产生阶段由Cebuild.bat完成,文件拷贝阶段由Buildrel.bat完成,最后的生成映像阶段由Makeimg.exe完成。下面介绍一下各个阶段。
TOOLS
Tool
Description
Build Demo Tool (Blddemo.bat)
Calls all tools necessary to create Windows Embedded CE–based OS functionality, generate source code, copy files to a release directory, and make a run-time image.
调用其他工具,创建wince OS,生成源代码,拷贝文件到release目录,制作run-time image
Build Release Directory Tool (Buildrel.bat)
Copies all modules and files required to build the run-time image to a common release directory.
拷贝需要的模块和文件,到release目录
Build Tool (Build.exe)
Creates executable files for the target device.
创建目标设备的可执行文件
Cesysgen Batch File (Cesysgen.bat)
Specifies the Windows Embedded CE–based modules and functionality for the target device.
定义目标设备的模块和功能
fMerge Tool (fmerge.exe)
Combines all existing binary image builder (.bib) files into one .bib file, and all registry (.reg) files into one .ini file.
把所有的bib文件整合成一个ce.bib文件(定义了哪些文件要被包含到run-time image里面),所有reg文件整合成一个reginit.ini文件。
Make Binary Image Tool (Makeimg.exe)
Creates a run-time image.
创建run-time image
Master Build Tool (Cebuild.bat)
Creates the Windows Embedded CE–based modules and functionality and builds source code for each project in an OS design.
创建模块和功能,编译源代码
Set Environment Variable Tool (Setenv.bat)
Sets customized developer environment variables. Used by Wince.bat; do not call this tool directly.
设置开发环境变量,不要直接调用,由wince.bat调用
Sysgen Tool (Sysgen.bat)
Creates the Windows Embedded CE–based modules selected in Cesysgen.bat by linking the functionality specified in Cesysgen.bat.
根据cesysgen.bat,连接功能,创建模块
Sysgenplatform Tool (Sysgenplatform.bat)
Links the files in your run-time image during the Sysgen phase of the build process.
在系统生成阶段,连接文件
Windows Embedded CE Build Environment Tool (Wince.bat)
Sets up the Windows Embedded CE build environment.
设置wince的编译环境
Build System
Windows Mobile下的编译分为四个阶段:
1. The Compile Phase
2. The Sysgen Phase
3. The Release Copy Phase
4. The Make Run-Time Image Phase
在不同的阶段,它们分别调用不同的工具(.bat文件或.exe文件)完成不同的工作.
Compile Phase
1. 编译器(Build.exe)和连接器(Linker)利用源代码文件生成静态库文件。
2. 一些本地化的工作(Localization tasks)把resource script. (.rc)文件编译成binary resource (.res)文件。
Sysgen phase
主要功能是根据用户设置的一些组件环境变量,生成想要的头文件及可执行文件,供最终的wince运行时映像打包使用。
1. sysgen.bat处理传进来的命令行参数,如-h, -b, -c, -q等。
2. sysgen.bat调用ceysgen.bat来设置或清除一些环境变量,包括3类<tree>_MODULES (某棵数下面包含的组件),CE_MODULES(COMMON目录树下的所有组件),<module>_COMPONENTS(指定某个模块所需要的组件)
3. cesysgen.bat文件调用cebasecesysgen.bat文件来处理上述的3个步骤。
4. sysgen.bat处理一些多语言和本地化相关的操作
5. sysgen.bat调用nmake来对所选的模块进行过滤和链接工作。过滤工作主要由CeFilter.exe完成,对头文件.h和4种平台配置文件(REG, DAT, DB, BIB)。CeFilter根据用户选择的环境变量,对这些文件进行处理,把没有用的模块过滤掉,只保留有用的模块。
CeFilter搜索@CESYSGEN,读取后面的<module>, <component>标签,根据环境变量里用户的设置情况,决定保留还是删除@CESYSGEN IF和@CESYSGEN ENDIF之间标记的内容。
Release Copy phase
1. 把生成OS image需要的所有文件都拷贝到Release目录下。
Make Run-Time Image phase
1.用Release目录下的文件生成OS image。
Build in WindowsMobile
2.1初次编译整个BSP
利用New Build Window Wizard,可以在桌面上建立三个命令行的快捷方式:Update Loader -×××、Base OS -×××、Build All -×××,分别对应于三个批处理文件UpdateLoaderEnv.bat、BaseOSEnv.bat、BuildAll.bat。
Update Loader Shortcut:
Update Loader Shortcut对应于Update Loader的编译。双击该快捷方式,运行UpdateLoaderEnv.bat对编译环境进行设置后,在命令行提示符中输入:
blddemo clean –q,再敲回车即可编译整个Update Loader。
Base OS Shortcut:
Base OS Shortcut对应于operating system的编译。双击该快捷方式,运行BaseOSEnv.bat对编译环境进行设置后,在命令行提示符中输入:blddemo clean –q,再敲回车即可编译整个operating system。但完成这个命令的前提是%_PLATFORMROOT%"%_TGTPLAT%"Files目录下存在uldr.nb0文件。
Build All Shortcut:
Build All Shortcut对应于整个代码的编译,双击该快捷方式后,自动完成整个代码的编译,它先编译Update Loader,然后再编译Operating System,是上述两部分工作的总和。
通常,初次Rebase一个BSP后,都应该运行该快捷方式,对整个代码进行编译。但如果初次Rebase后的代码中%_PLATFORMROOT%"%_TGTPLAT%"Files目录下已经存在uldr.nb0文件,而又不需要对Update Loader进行调试,这是就可以运行Base OS Shortcut,中命令行中输入blddemo clean –q,再敲回车即可,这样就可以节省编译Update Loader的时间。
2.2 Rebase新基线后Operating System的编译
因为通常我们都是对Operating System部分进行调试,所以以下的讨论都是针对Operating System的编译,Update Loader部分的编译是类似的。
新的基线生成时,大部分模块的代码都做了根新。Rebase一条新基线后,我们需要在新的基线上工作,这时就要重新生成OS image。双击Base OS Shortcut,在命令行提示符下输入blddemo clean –q,再敲回车。下面对blddemo.bat这个批处理文件的参数做一点说明。
blddemo.bat有两个常用的参数:clean和-q
clean
使用这个参数会清除Cesysgen目录,它们是%_PROJECTROOT%"Cesysgen and %_PLATFORMROOT%"Cesysgen。
以下两种情况需要使用这个参数:
1. 修改了%_WINCEROOT%"Public"CEBASE"OAK"Misc目录下的Cesysgen.bat文件。
2. 修改了会影响到Cesysgen.bat的环境变量,如以SYSGEN或BSP为前缀的变量。
如果确定以上两种情况都不存在,可以去掉clean这个参数,这样可以节省清除和重建Cesysgen目录的时间。
-q
使用这个参数表示编译系统不会编译Public目录下的代码,这样可以节省编译Public目录的时间。
一般情况下这个参数都会被使用,除非你修改了Public目录下的代码。
当然,blddemo.bat还有其它的可选参数,关于这些参数的说明可在Windows Mobile的帮助文档中找到,地址:
Adaptation Kit User's Guide > Build System Overview > Build System Tools
2.3模块调试过程中的编译
模块调试过程中的编译有两种情况,一是源代码修改后,需要重新编译;二是相关的配置文件(如.reg文件)修改后,需要重新生成OS image。
2.3.1源代码的修改
Microsoft Platform. Builder for Windows Mobile 5.0提供了一个功能,使得我们在调试时,可以用新生成的模块代替旧的模块而不需要重新生成OS image,而且可以用新的debug版的模块代替旧的retail版的模块,这样可以节省大量的时间。
下面以IMPACE的Camera Driver模块为例,说明如何操作:
1. 双击Base OS Shortcut,在命令行提示符下用cd命令进入到需要编译的模块的目录。
在命令行提示符下输入以下命令,敲回车。
cd PLATFORM"IMPCE"SRC"DRIVERS"CAMERA
2. 如果需要生成一个debug版本的模块,执行这一步,否则,跳过。
在命令行提示符下输入以下命令,敲回车。
set WINCEDEBUG=debug // WINCEDEBUG和=之间不能有空格
3. 在命令行提示符下输入以下命令,敲回车,使编译完成后把相关的文件拷贝到Release目录下。
set WINCEREL=1 //一般可省略,WINCERE在%_TGTPLAT%.bat会设置为1
4. 在命令行提示符下输入以下命令,敲回车,编译当前模块。
Build //如果要清除旧的.obj文件,可加参数–c,但会多费点时间
Build.exe也有其它的一些可选参数,常用的一般是-c ,关于Build.exe其它参数的说明,在Windows Mobile的帮助文档上有详细的说明,地址:
Adaptation Kit User's Guide > Build System Overview > Build System Tools
5. 在Platform. Builder的File菜单中,选择Open。
6. 选择BSP的Release目录,打开相应的文件,如FLASH.bin。
7. 在Platform. Builder的Target菜单中,选择Release Directory Modules。
8. 在弹出的菜单中,选择Add,再在弹出的菜单中输入或选择模块相应的模块,点OK。
9. 运行系统,开始调试。
2.3.2配置文件的修改
在调试过程中,如果需要对配置文件做修改,来改善系统的性能,增加或减少OS image中模块,则可以直接在Release目录下修改经过虑后的该配置文件,然后双击Base OS Shortcut,在命令行提示符下输入makeimg,敲回车。
例如:
需要修改.reg文件,在Release目录下打开platform.reg,找到相应的项,修改完成后makeimg。
调试成功后,再在这些配置文件的原文件上做修改。
错误分析
在整个编译过程中有时会遇到编译错误,这个可以通过察看Build.log,Build.err和Build.wrn文件来分析问题,这三个文件应该是位于”WINCE600”目录下面。编译错误可能在不同的编译阶段产生,我们也可以根据这一点来分析问题。
一般在系统产生阶段(Sysgen phase)出现错误很可能是由于丢失组件或文件造成的,这时候Build.log会提供更多信息帮助分析问题。在这个阶段产生错误,很可能是由于在当前工程中添加或者删除WinCE组件造成的,其中有些组件的更改是需要进行”clean sysgen”的,而不能只使用”sysgen”命令。所以我的建议是每次添加或删除组件都做”clean sysgen”。
如上面介绍系统产生阶段(Sysgen phase)也会编译BSP和部分应用。所以如果错误出现在系统产生阶段的编译过程中,一般一种可能就是你的代码有语法错误,当然这种错误很好查。还有一种可能出现的错误是连接错误,有可能是丢失了lib库文件或者链接错了库文件,也有可能是调用了错误的API函数,还有就是设置了错误的环境变量,这些查起来相对困难一点。
如果错误产生在文件拷贝阶段(Release copy phase),一种常见的问题就是和硬盘驱动器有关,检查一下release目录所在磁盘的磁盘空间。
如果问题出现在生成映像阶段(Make run-time image phase),根据编译的输出窗口的输出信息判断问题出在哪个子阶段。一种可能是你的bib文件或者reg文件中存在语法错误导致合并文件时出错,还有就是注意你的image的大小是否超过了config.bib文件中的设定,还有就是可能丢失了某个或者某些文件,这些丢失的文件很可能是由于在前面的编译过程中出现错误导致的。
当然,也有时候会遇到一些奇怪的问题,这些问题可能是由于没有正确的安装WinCE造成的,比如在安装WinCE的时候,路径中不要有中文或者空格或者其他比较奇怪的字符。补丁要按照顺序来打,要不也可能会出现问题。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/vincew/archive/2009/04/28/4133547.aspx