WinCE5 sources文件中TARGETLIBS与SOURCELIBS字段的作用与区别

在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的帮助文件中,有说明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)
    << span>


    可以看出,是忽略了TARGETLIBS的东西

 
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
       nk.exe          $(_FLATRELEASEDIR)/kern.exe                 NK  SHXL
    ENDIF IMGNOKITL
    IF IMGNOKITL !
       nk.exe          $(_FLATRELEASEDIR)/kernkitl.exe             NK  SHXL
    ENDIF IMGNOKITL !

 

这里也就说明了KITL开关的原理(build层面的关闭)

 

从上面的说明,我们是否可以得到以下结论:

1. 对于LIBS,targetlibs是没有使用的, 对于DLL和EXE,只是链接顺序的不同

2. 在build DLL和EXE时需要小心相同函数的覆盖关系

 

这些都是基于WinCE5的代码,以上结论成立的因素:

对于结论1,需要熟悉NMake的朋友说明下我的解释是否正确

对于结论2, 需要熟悉链接器的朋友说明下我对链接规则的解释是否正确

PS:

wince下link如果都是库的话,同名函数不能自动覆盖,ktil.c的同名函数覆盖是通过obj覆盖库来实现的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C++&OPENCV 的全景图像拼接 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程和泛型编程的支持。C++支持数据封装、继承和多态等面向对象编程的特性和泛型编程的模板,以及丰富的标准库,提供了大量的数据结构和算法,极大地提高了开发效率。12 C++是一种静态类型的、编译式的、通用的、大小写敏感的编程语言,它综合了高级语言和低级语言的特点。C++的语法与C语言非常相似,但增加了许多面向对象编程的特性,如类、对象、封装、继承和多态等。这使得C++既保持了C语言的低级特性,如直接访问硬件的能力,又提供了高级语言的特性,如数据封装和代码重用。13 C++的应用领域非常广泛,包括但不限于教育、系统开发、游戏开发、嵌入式系统、工业和商业应用、科研和高性能计算等领域。在教育领域,C++因其结构化和面向对象的特性,常被选为计算机科学和工程专业的入门编程语言。在系统开发领域,C++因其高效性和灵活性,经常被作为开发语言。游戏开发领域,C++由于其高效性和广泛应用,在开发高性能游戏和游戏引擎扮演着重要角色。在嵌入式系统领域,C++的高效和灵活性使其成为理想选择。此外,C++还广泛应用于桌面应用、Web浏览器、操作系统、编译器、媒体应用程序、数据库引擎、医疗工程和机器人等领域。16 学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新系统或维护旧系统。3
该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
使用c++语言,基于opencv开发的车牌识别系统C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程和泛型编程的支持。C++支持数据封装、继承和多态等面向对象编程的特性和泛型编程的模板,以及丰富的标准库,提供了大量的数据结构和算法,极大地提高了开发效率。12 C++是一种静态类型的、编译式的、通用的、大小写敏感的编程语言,它综合了高级语言和低级语言的特点。C++的语法与C语言非常相似,但增加了许多面向对象编程的特性,如类、对象、封装、继承和多态等。这使得C++既保持了C语言的低级特性,如直接访问硬件的能力,又提供了高级语言的特性,如数据封装和代码重用。13 C++的应用领域非常广泛,包括但不限于教育、系统开发、游戏开发、嵌入式系统、工业和商业应用、科研和高性能计算等领域。在教育领域,C++因其结构化和面向对象的特性,常被选为计算机科学和工程专业的入门编程语言。在系统开发领域,C++因其高效性和灵活性,经常被作为开发语言。游戏开发领域,C++由于其高效性和广泛应用,在开发高性能游戏和游戏引擎扮演着重要角色。在嵌入式系统领域,C++的高效和灵活性使其成为理想选择。此外,C++还广泛应用于桌面应用、Web浏览器、操作系统、编译器、媒体应用程序、数据库引擎、医疗工程和机器人等领域。16 学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新系统或维护旧系统。3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值