本文主要描述了SOURCELIBS和TARGERLIBS这两个宏的区别,它们被广泛应用在使用PB来编译Wince/Windows mobile的source文件中出现,本文参考了网上的一些资料,并结合自己的理解,其中的说明有错误的地方,请不吝指正。
根据Crossbow的文档,SOURCELIBS主要用于创建一个新的静态库(LIBs),并且生成的库中使用了其他的静态库,它的作用是指定了哪些静态库(lib)将被链接到目标库中,例如:
SOURCELIBS =/
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/ddk_io.lib/
$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/fulllibc.lib
表示生成的目标库中使用了ddk_io.lib和fulllibc.lib,但这并不是必须的,因为静态库中的接口可以没有其实现,可以在使用它的DLLs或者EXEs通过TARGERLIBS去指定需要链接的静态库。
TARGERLIBS用于链接目标可执行文件(EXEs或DLLs)所需要的一些静态库,EXEs或DLLs必须包含每一个函数接口的实现。
SOURCELIBS和TARGERLIBS的存在是Wince模块化特征,链接的过程分为两步:第一步,合并SOURCELIBS指定的静态库,生成单个目标静态库;第二步,链接目标静态库、TARGERLIBS指定的静态库,生成目标可执行文件。如果你已经在SOURCELIBS所指定的静态库test1.lib中定义了一个函数Function1,并且Function1在TARGERLIBS中的某个库中test2.lib也已经有其实现,这时会排除test2.lib中的Function1而使用test1.lib中的Function1,这样就实现了所谓的“条件链接”。但是如果source文件仅包含TARGERLIBS不包含SOURCELIBS,这时将无法确定包含哪个版本的Function1,如上面所说的,实现的函数(源文件中的Function1)具有一个高的优先权进行链接。
下面表示库在上面情况下被链接以及链接的次序(可能会随PB版本的不同而发生变化):
EXEs
仅仅TARGERLIBS指定的库被链接,SOURCELIBS中的任何库都会被忽略。
DLLs
SOURCELIBS
和TARGERLIBS
指定的库都会被按顺序链接。
LIBs
SOURCELIBS
仅仅指定的库被链接,TARGERLIBS中的任何库都会被忽略。