在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)
    <<NOKEEP

可以看出,是忽略了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时需要小心相同函数的覆盖关系

WinCE中sources文件中targetlibs与sourcelibs的作用与区别相关推荐

  1. Myeclipse中js文件中的乱码处理

    Myeclipse中js文件中的乱码处理 导入外部js文件到MyEclipse中打开是乱码,无法设置使用哪种编码格式,总不能在里面加上<%@ page pageEncoding="UT ...

  2. Android:Android NDK项目中C++文件中打印日志

    Android NDK项目中C++文件中打印日志 工作需要,在NDK项目中的C++文件中打印日志,还是费了点劲查找 才达到自己 想要的效果了. 步骤 添加头文件 添加头文件 定义宏函数 #includ ...

  3. 在linux中的文件中查找_如何在Linux中查找文件

    在linux中的文件中查找 如果您是Windows用户或OSX的非超级用户,则可能使用GUI查找文件. 您可能还会发现界面有限,令人沮丧或两者兼而有之,并且学会了精于组织事物并记住文件的确切顺序. 您 ...

  4. 计算机内用户文件夹中的文件,在位于计算机上所有用户的AppData文件夹中的文件中修改一行...

    我想修改位于计算机上所有用户的AppData文件夹中的文件中的一行.在位于计算机上所有用户的AppData文件夹中的文件中修改一行 线在prefs.js文件来改变开始: user_pref(" ...

  5. WINCE BSP中source文件中的宏定义

    在WinCE BSP中会看到很多sources文件,一般会和源代码放在同一个目录,当然不是绝对的.这些sources文件里面就是定义了一些宏,主要用于告诉Build.exe在编译源代码的时候应该如何编 ...

  6. 【C 语言】文件操作 ( 学生管理系统 | 命令行接收数据填充结构体 | 结构体写出到文件中 | 查询文件中的结构体数据 )

    文章目录 一.学生管理系统 二.代码示例 一.学生管理系统 前两篇博客 [C 语言]文件操作 ( 将结构体写出到文件中并读取结构体数据 | 将结构体数组写出到文件中并读取结构体数组数据 ) [C 语言 ...

  7. Python中读取文件中的json串,并将其写入到Excel表格中

    Json:JavaScript Objective Notation,是一种轻量级的数据交换格式.Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式.现在也常用语http请求中, ...

  8. 如何解决项目中.a文件中的.o冲突

    项目中使用了yuemengsdk.a  现又加入了百度 libbaiduNaviSDK.a 有了冲突 我们需要把.a文件中的.o文件删除 第一步 先将项目备份..万一没玩好..去哪说理~~ 第二步 在 ...

  9. Mybatis中mapper文件中的两层循环

    导言 使用mapper.xml文件来存储和执行sql语句是Mybatis框架中重要的应用.在mapper.xml文件中对List数据的循环遍历较为普遍和常用,而两层或多层循环是大家不常用的.下面简单介 ...

最新文章

  1. 调用实现天气预报功能android,Android编程实现获取新浪天气预报数据的方法
  2. dataimagepng php_浅析data:image/png;base64的应用
  3. 理解ROS话题---ROS学习第5篇
  4. USTC English Club Note20211108
  5. Mule ESB-3.Build a webservice proxy
  6. SharePoint 2010 在多台前端环境 还原 网站集 问题解析
  7. 二维数组按行排序C语言,二维数组对每一行进行排序。。
  8. opengles 2.0 点精灵 多边形偏移等备忘
  9. js 正则 exec() 和 match() 数据抽取
  10. EXE文件反编译工具下载
  11. 韩立刚计算机网络笔记-第04章 数据链路层
  12. CDR 网状填充高级图形
  13. B2C电商项目(第八天、用户认证、单点登录、Oauth2认证、项目认证开发、认证服务对接网关、登录页、SpringSecurity 权限控制)
  14. java 调用三角函数_Java中的三角函数方法
  15. WKWebview使用记录
  16. 如何选择适合自己数据的统计检验方法
  17. 数学公式公式获取工具 Mathpix snipping Tool
  18. 25款顶级的jQuery表格插件
  19. MySQL实验超市管理系统_超市会员管理系统(数据库)实验报告.doc
  20. RHEL8修改root密码

热门文章

  1. 根据二叉树写遍历序列
  2. try...catch的方式处理多个异常
  3. go iris 连接 mysql 异步_go语言解决并发的方法有哪些?
  4. python中randn函数_numpy常用函数之randn
  5. 大朗机器人餐厅在哪里_东莞餐厅惊现机器人服务员 平均每个10万元
  6. java.lang.NoSuchMethodException: getPackageSizeInfo
  7. c++ string 堆还是栈_5个刁钻的String面试题解析
  8. 在显著性区域外画矩形框matlab,Matlab实验报告样板
  9. 深入理解JVM虚拟机(十):Java内存模型与多线程
  10. 计算机编程英文术语,计算机编程英语词汇