WinCE中sources文件中targetlibs与sourcelibs的作用与区别
- 格式:doc
- 大小:244.00 KB
- 文档页数:10
1 引言在当今后PC时代,嵌入式系统应用得越来越广泛,嵌入式产品充斥着许多领域,日常生活的手机,MP4,PDA等都属于典型的嵌入式系统。
在嵌入式系统中,微处理器和操作系统是进行应用开发的基础。
在微处理器方面,S3C2410是Samsung公司推出的一款基于ARM920T内核的16/32位RISC嵌入式CPU,主要面向手持设备以及高性价比、低功耗的应用。
在操作系统方面,Windows CE 5.0是由微软提供的一款嵌入式操作系统,在Windows CE 4.2基础上,它又加入了一些新特性以满足市场需求。
板级支持包(Board Support Package,BSP)是操作系统的一个组成部分,提供对硬件的支持。
BSP的开发在整个产品开发时间上占了很大比例,快速的移植满足产品需求的BSP在竞争激烈的市场环境里显得很重要。
目前已有许多关于S3C2410、Windows CE以及BSP相关的研究报道,文献[1]研究基于S3C2410的GPS通信技术及实现,文献[2]中详尽分析Windows CE的结构,文献[3]中归纳了Windows CE 4.2专用操作系统的定制和裁剪方法,文献[4]则探讨基于DSP嵌入式多媒体应用系统板级支持包的开发。
目前关于Windows CE的应用主要采用Windows CE 4.2及以下版本,本文研究基于S3C2410的Windows CE 5.0 BSP移植技术。
2 Windows CE 5.0及BSP结构分析移植基于S3C2410的Windows CE 5.0 BSP,需要分析Windows CE 5.0 及BSP结构。
Windows CE 5.0是一款开放的、可升级的32位嵌入式操作系统,具有高可靠性,是一种硬实时嵌入式操作系统,它可以在多种处理器架构(如x86、MIPS、ARM和SH4)上运行,Windows CE支持ARM体系结构,这是基于S3C2410 处理器进行BSP移植的前提条件。
ddk学习中遇到的问题和解决方法/lweiyan/blog/item/8b9d22091fd8c9c73ac763f6.html2009年05月16日星期六 17:55关于Driver Studio 3.2 的安装详解经过对VC、WINDDK、Driver Studio这三个软件反复的安装,终于可以使Driver Studio能在VC环境下正常编译了。
俗话说久病成医,遇到的问题多了,自然就有了很多解决问题的方法,现在拿出来和大家一起分享一下。
1、分别安装VC、WINDDK、Driver Studio,为:VC-〉WINDDK-〉 Driver Studio。
其实顺序也可以变一下的,笔者曾试过VC-〉 Driver Studio -〉WINDDK,没问题的,但最好按建议顺序安装;2、注意安装DDK时,建议将例子等全部安装,否则Driver Studio编译时会提示缺少头文件;3、在VS2005环境下,安装Driver Studio时会有对话框弹出,单击Ignore按钮,解决办法会在后面详细说明;4、选择“DriverStudio->DDK Build Setting”,在“DDK Root Directory”选项中选入DDK目录,例如“C:\WINDDK\2600”。
为了防止每次启动VC来编译WDM时,都要设置DDK目录,可以在“控制面板”的“系统”-〉“高级”-〉“环境变量E”设置中,添加一个值为C:\WINDDK\2600的系统变量BASEDIR;5、用VC打开“…\DriverStudio\DriverWorks\source\VdwLibs.dsw”,用 Driver Studio进行编译,如果编译成功就OK了,然后可以进行驱动的开发了。
6、利用DriverWizard向导对所要开发的驱动类型进行正确配置,生成所需要的驱动工程框架。
安装DriverStudio3.2 过程中出现DSDDKEnv8.dll failed to register错误的解决方法原因:与VS2005集成时会发生此错误。
在WinCE中使用的一个重要的文件就是BIB文件,全称Binary Image Builder File。
在WinCE的编译过程中会用到BIB文件,应该是在最后的Makeimg阶段。
所有的BIB文件会被合并成CE.bib文件,然后Romimage.exe会根据BIB文件中的描述来决定哪些文件最终被包含到WinCE image中。
当然,BIB文件还决定了WinCE设备内存的分配,其中定义了WinCE image占用哪块内存,Framebuffer占用哪块内存等。
在BIB文件中分为4大项:MEMORY项,CONFIG项,MODULES项和FILES项。
下面分别作个解释:MEMORY:定义了内存分配的相关设置,一般在BSP中的config.bib文件中。
CONFIG:在最后的Makeimg阶段,为Romimage.exe提供一些生成WinCE image的配置属性。
该项是可选的,一般也在BSP中的config.bib文件中定义。
MODULES:定义了一些会被打包到WinCE image中的模块或者文件,比如dll,exe等。
这些文件会被Romimage.exe标记为加载到RAM中或者XIP。
我们可以在这里添加自己的WinCE应用程序或者模块,但是不要添加Managed Binaries,一般指.NET的程序。
FILES:定义了一些操作系统会用到的其他的文件,比如字体文件,图片等。
这些文件也会在WinCE运行的时候被加载到RAM中。
下面会详细介绍上面的4大项:1. MEMORY项一般都在config.bib文件中定义,开头会有MEMORY的字样。
这里定义了为WinCE image 以及其他模块预留的RAM,同时也定义了WinCE可以使用的RAM。
具体格式如下:MEMORYNAME Start Address Memory Size TypeNAME:该内存区域的名字,必须是唯一的。
Start Address:该内存区域的起始地址,用十六进制表示。
source命令与“.”点命令source 命令是bash shell 的内置命令,从C Shell 而来。
source 命令的另一种写法是点符号,用法和source 相同,从Bourne Shell而来。
source 命令可以强行让一个脚本去立即影响当前的环境。
source 命令会强制执行脚本中的全部命令,而忽略文件的权限。
source 命令通常用于重新执行刚修改的初始化文件,如.bash_profile 和.profile 等等。
source 命令可以影响执行脚本的父shell的环境,而export 则只能影响其子shell的环境。
使用方法举例:$source ~/.bashrc或者:$. ~/.bashrc执行后~/.bashrc 中的内容立即生效。
一个典型的用处是,在使用Android 的mm 等相关命令时,需要先执行以下命令:$cd <android source path>$source ./build/envsetup.sh 或者$. ./build/envsetup.shsource命令(从C Shell 而来)是bash shell的内置命令。
点命令,就是个点符号,(从Bourne Shell而来)是source的另一名称。
同样的,当前脚本中设置的变量也将作为脚本的环境,source(或点)命令通常用于重新执行刚修改的初始化文件,如.bash_profile 和.profile 等等。
例如,如果在登录后对.bash_profile 中的EDITER 和TERM 变量做了修改,则能用source 命令重新执行.bash_profile 中的命令而不用注销并重新登录。
source命令的作用就是用来执行一个脚本,那么:source a.sh 同直接执行./a.sh 有什么不同呢,比如你在一个脚本里export $KKK=111 ,如果你用./a.sh执行该脚本,执行完毕后,你运行echo $KKK ,发现没有值,如果你用source 来执行,然后再echo ,就会发现KKK=111。
WINCE源代码配置文件WINCE的编译工具Build.exe通过WINCE源代码配置文件提供的下面的信息来编译指定的目录及子目录的源代码(source code):1)要贯穿的目录。
2)要编译的C和微软的的Visual C++文件。
3)创建的二进制文件。
WINCE源代码配置文件是指下面类型的文件1)Dirs File指dirs文件,用于识别包含源代码的子目录,也就是要编译的源代码所在的目录。
2)Make File指文件夹下面的makefile文件,包含要编译和链接源代码所需要的变量。
3)Module-Definition File比如是power按键驱动文件下下面的PowerButton.DEF文件,包含在一个可执行或者dll文件中定义的共用符号、函数和变量的声明。
4)Sources File包含编译源代码所需要的宏变量。
编译工具贯穿一个目录树,先查找dirs文件,然后是sources文件。
其中dirs 文件指定要包含的源代码或是另外的包含sources文件的子目录。
当编译工具在当前的目录定位到一个sources文件,它就调用Nmake tool(Nmake.exe)来编译指定的C或C++源代码文件,并且根据包含在makefile文件的链接规则来链接目标模块。
图1下面就来分别学习这四种源代码配置文件:1.dirs文件dirs文件是一个text文件,它指定了包含要编译的源代码的目录,如SMDK6410 \SRC下的dirs内容:DIRS = \common \oal \kitl \drivers \bootloader这表示SMDK6410 \SRC目录下的dirs文件要编译common、oal、kitl、drivers 和bootloader目录下或者是这些目录下的子目录的源代码文件。
Dirs文件内容中使用DIRS、DIRS_CE和OPTIONAL_DIRS关键字来如何编译指定的目录1)DIRS如上面所示,DIRS用于指定要编译的目录,其中DIRS=*表示要编译当面所有的目录,另外上面的例子也可以改为下面的方式来指定要编译的目录DIRS=common oal kitl dirvers bootloader也就是用空格键把要编译的目录隔开,但这样不直观,不提倡采用这样的方式。
sources文件详解在Windows CE中,所有的驱动程序都以dll形式存在。
Dll文件可以用EVC来开发,也可以使用PB来开发,使用PB开发驱动程序,可以跟NK同时进行编译,要比EVC来的方便一点。
这篇文章就只要介绍用PB来进行dll库开发的方法。
使用PB来开发,首先应该在你的工作平台下面建立一个目录,用来存放源文件,同时要修改dir文件,使得编译的时候能够进到源文件所在的目录。
编写dll的方法这里就不说了,反正就是写一堆的函数,这里主要解释一下使用PB编译,需要增加的文件。
第一个文件是sources文件,这里给出了一个sources文件的例子:TARGETNAME=led使用TARGETNAME来指示生成目标的文件名(不包含扩展名,扩展名PB会自动加上)RELEASETYPE=PLATFORMRELEASETYPE指示该文件将要生成的类型,一共有五个取值:SDK:使用该类型将使得生成的目标文件被存储到%_PUBLICROOT%\Oak目录,而lib文件被放置到%_PUBLICROOT%\Sdk目录DDK:使用该类型将使得生成的目标文件被存储到%_PUBLICROOT%\Oak目录,而lib文件被放置到%_PUBLICROOT%\DdkPLATFORM:使用该类型将使得生成的文件受平台控制LOCAL:该类型使得生成的文件全部放置到当前路径CUSTOM:该类型使得生成的文件放置到TARGETPATH 制定的位置(也就是说必须要有TARGETPATH参数设置)TARGETTYPE=DYNLINK生成的目标类型,LIBRARY表示是一个lib库,DYNLINK 则表示是dll,而PROGRAM则是一个exe文件TARGETLIBS=$(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib TARGETLIBS指示连接需要的库的名字SOURCELIBS=mm.libSOURCELIBS指示将于某一个lib一起连接。
Source Insight实质上是一个支持多种开发语言(java,c ,c 等等)的编辑器,只不过由于其查找、定位、彩色显示等功能的强大,常被我们当成源代码阅读工具使用。
作为一个开放源代码的操作系统,Linux附带的源代码库使得广大爱好者有了一个广泛学习、深入钻研的机会,特别是 Linux内核的组织极为复杂,同时,又不能像windows平台的程序一样,可以使用集成开发环境通过察看变量和函数,甚至设置断点、单步运行、调试等手段来弄清楚整个程序的组织结构,使得Linux内核源代码的阅读变得尤为困难。
当然Linux下的vim和emacs编辑程序并不是没有提供变量、函数搜索,彩色显示程序语句等功能。
它们的功能是非常强大的。
比如,vim和emacs就各自内嵌了一个标记程序,分别叫做ctag和etag,通过配置这两个程序,也可以实现功能强大的函数变量搜索功能,但是由于其配置复杂,linux附带的有关资料也不是很详细,而且,即使建立好标记库,要实现代码彩色显示功能,仍然需要进一步的配置(在另一片文章,我将会讲述如何配置这些功能),同时,对于大多数爱好者来说,可能还不能熟练使用vim和emacs那些功能比较强大的命令和快捷键。
为了方便的学习Linux源程序,我们不妨回到我们熟悉的window环境下,也算是“师以长夷以制夷”吧。
但是在 Window平台上,使用一些常见的集成开发环境,效果也不是很理想,比如难以将所有的文件加进去,查找速度缓慢,对于非Windows平台的函数不能彩色显示。
于是笔者通过在互联网上搜索,终于找到了一个强大的源代码编辑器,它的卓越性能使得学习Linux内核源代码的难度大大降低,这便是Source Insight3.0,它是一个Windows平台下的共享软件,可以从/上边下载30天试用版本。
由于Source Insight是一个Windows平台的应用软件,所以首先要通过相应手段把Linux系统上的程序源代码弄到Windows平台下,这一点可以通过在 linux平台上将/usr/src目录下的文件拷贝到Windows平台的分区上,或者从网上光盘直接拷贝文件到Windows平台的分区来实现。
windows动态库编译流程Windows动态库编译流程是将源代码转化为可执行的动态链接库(DLL)的过程。
以下是关于Windows动态库编译流程的参考内容(不包含链接)。
1. Windows动态库的编译流程通常由以下几个步骤组成:(1)预处理:预处理器会根据预编译指令处理源代码文件,例如#include指令可以将其他头文件的内容插入到当前文件中,宏定义可以在编译过程中替换为相应的内容等等。
(2)编译:编译器将预处理后的源代码文件编译成特定机器平台的目标文件,通常是一种中间代码形式,也就是目标文件(.obj)。
(3)链接:连接器将目标文件、库文件以及其他依赖项进行链接,生成最终的可执行文件或动态链接库。
连接器会解析目标文件之间的调用关系,并将函数、变量的引用解析为实际的地址。
2. 在Windows平台上,常用的编译器是微软的Visual Studio编译器。
在使用Visual Studio进行动态库编译时,可以按照以下步骤进行设置和操作:(1)新建项目:打开Visual Studio,选择“文件”→“新建”→“项目”,选择合适的项目类型(如C++库或通用Windows动态链接库等)。
根据需要进行项目的设置。
(2)编写源代码:在项目中添加源代码文件,编写动态库的实现代码。
(3)设置编译选项:右键点击项目,选择“属性”,在属性窗口中设置编译选项,如C/C++编译器的预处理器定义、头文件搜索路径、编译器警告等级、调试信息生成等。
(4)编译项目:按下F7键或选择菜单项“生成”→“生成解决方案”对项目进行编译。
编译成功后,将生成目标文件(.obj)。
(5)链接库文件:如果需要使用其他库文件,可以将这些库文件添加到项目中,并在属性窗口的链接器选项中指定库文件的路径。
(6)生成动态库:按下Ctrl+Shift+B或选择菜单项“生成”→“生成解决方案”对项目进行生成。
生成成功后,将得到最终的动态链接库文件(.dll)。
[原创] WinCE中sources文件中targetlibs与sourcelibs的作用与区别[复制链接] wwfiney 当前离
线
最后登录2011-12-23 在线时间488 小时权威
71
金币
1455
注册时间2009-2-9 阅读权限200
帖子
1286
精华
4
积分
1707
UID
86
管理员
权威
71
金币
1455
阅读权限200
积分
1707
精华
4 电梯直达
主题贴
wwfiney 发表于2009-2-11 17:23:04 |只看该作者|倒序浏览
在WinCE里面,编译和链接的必备文件sources,做过WinCE BSP开发的一定都很熟悉,其中有2个关键字,targetlibs和sourcelibs,一直让我对其中的区别很感兴趣,故查阅了一些资料,与大家分享。
其实只要搜索以下就会得到一些基本的答案,比如:
TARGETLIBS,如果一个库以DLL的形式提供给调用者,就需要用TARGETLIBS,它只链接一个函数地址,系统执行时会将被链接的库加载。
比如coredll.lib就是这样的库文件。
即动态链接。
SOURCELIBS,将库中的函数实体链接进来。
即静态链接,用到的函数会在我们的文件中形成一份拷贝。
这个答案已经基本解决问题了,但是这个答案让我们能看到更深入的东西:
This is componentization feature of Windows CE.
The link has two steps. First, whatever is in SOURCELIBS gets combined in a
signle library yourproductname_ALL.lib. In the second step, executable module is linked from that library and all the targetlibs.
This is done to allow stubs to be conditionally linked: if the function is defined into your source already, stubs get excluded. If it is not there, stubbed version (returning ERROR_NOT_IMPLEMENTED or something to that
effect) gets linked in instead.
If the link were to be performed in just one step, it would be impossible to predict which version (real or stub) would get included. As it is, implemented functions have a priority over stubs.
--
Sergey Solyanik
Windows CE Core OS
总的来说就是先编译了你自己在sources里指定的源文件,在链接阶段,先将所有的sourcelibs链接在一起成为一个lib,然后与targetlibs指定的lib一起参与链接。
当然这里targetlibs指定的可以是dll的lib文件,在CE的帮助文件中,
帖子1286
串个门加好友打招呼发消息有说明targetlibs可以使用import libraries or static libraries。
但是sourcelibs说明中指出一般用在把许多小的lib合并为一个大的lib。
还有关于用法的一些说明:
EXEs
Only TARGETLIBS get linked, anything in SOURCELIBS is ignored DLLs
SOURCELIBS and TARGETLIBS get linked, in that order
LIBs
Only SOURCELIBS get linked, anything in TARGETLIBS is ignored
Google groups 上Steve Maillet一直在回答相关的问题,并且强调只是一些link的顺序问题,可以参看makefile.def。
为了把问题弄清楚,看了下makefile.def因为很少接触makefile文件,所以凭有限的makefile知识,来解读下(MS的全自动化编译工具害人啊)
注:由于对makefile了解有限,如果分析有错误的地方请大家指出1. 关于LIBS的link
!IF "$(TARGETTYPE)" == "LIBRARY"
$(_RELEASELIBDIR)\$(TARGETNAME).lib: $(TARGETOBJFILES) $(SOURCELIBS)
@echo BUILD_MARKER:LINK_STATIC_LIBRARY_START Linking $@
$(LIBRARIAN) -out:$(_RELEASELIBDIR)\$(TARGETNAME).lib $(MACHINEOPTION) @<<
-ignore:4001
$(LIBDEFINES)
-nologo
-nodefaultlib
$(LINKER_SUBSYSTEM)
$(TARGETOBJFILES)
$(SOURCELIBS)
<<NOKEEP
2. 关于DLL
有些条件判断,但是链接顺序都是
$(TARGETOBJFILES)
$(SOURCELIBS)
$(TARGETLIBS)
3. 关于EXE
$(TARGETOBJFILES)
$(TARGETLIBS)
$(SOURCELIBS)
由此对
EXEs
Only TARGETLIBS get linked, anything in SOURCELIBS is ignored 产生了一些质疑
关于链接顺序:
在我的印象里,应该是出现同样的symbol,优先链接第一个出现的(查了半天也没有找到文档作为证明,不过我用bcc试了一下,默认是链接第一个出现的)。
这样就说明了链接顺序带来的影响,比如你的源文件里有一个func 这个函数的实现,但是在sourcelibs里包含的func1.lib里面也有同样函数的实现,这时候会使用你的源文件里面的func实现,而不是func1.lib 里面的,同样对应于targetlibs
这样做可以使用一些stub,比如KITL.c在BSP的两个地方实现Src\Kernel\Kern和Src\Kernel\Oal,而kern下的就是个stub,里面什么也没做,用来关闭KITL功能,OAL下的才是功能实体,在链接过程中,kern下使用TARGETLIBS来引入oal.lib,但是OAL下KITL.c里面的函数实现都已经被kern下的KITL.c替换了,这个生成的kern.exe 后续会在common.bib里面被加入NK.exe(关闭KITL的时候)。
而Src\Kernel\Kernkitl下生成的kernkitl.exe也引入了oal.lib,由于自身没有KITL的实现函数,所以实现代码就是OAL里面的代码,在打开KITL的时候就会加入NK.exe。
以下是common.bib的关于KITL的片断:
IF IMGNOKITL。