在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的时候,路径中不要有中文或者空格或者其他比较奇怪的字符。补丁要按照顺序来打,要不也可能会出现问题。