zoukankan      html  css  js  c++  java
  • 动态库静态库编译链接相关问题若干

    对于C++编译链接项目依赖什么的一直不明真相,不过通过遇到过的几个问题还是增长了一些了解。记录之。

    1. 库分为静态库动态库。动态库里面还有一种特别的是运行时有选择加载的插件,我改cocosbuilder的时候,载入的插件的函数有initWithBundle什么的,和这个有点儿联系。
    2. 静态库是会被编进去的,但是不是全体,没有用到的符号是不会被编进去的!这个具体现象可能还平台相关,之前遇到一个空指针crash bug,只在安卓有,windows没有。原因是某全局对象会在构造函数中把自己注册到一个模块列表中,随后启动后列表会调用所有注册模块的startup,因为没有调用相关指针初始化的函数,这个时候会出现空指针出错。但是这个问题只在安卓出现在windows不出现,因为该全局对象在代码中没有用到,于是编的时候压根没有编进去因此不会被构造出来,也就不会注册,更不会跑到有问题的startup函数了。
    3. 动态库里面,只有进行了标记的符号会被导出!之前在cocos2d里面加了一个新类,结果死活不行说符号找不到,我完全没有这个概念啊,结果死活找不到原因,花了半天时间都要绝望了,最后发现是少了CC_DLL,这样标注过的符号才会被导出来。Cocos2d是dll就有这个问题,但是extension是lib,所以在extension里加的新类就没有这个问题。
    4. 还是上面那个问题,有一次我们在cocosdenshion里面include了cocos2d.h,然后就又报符号的问题,后来发现CC_DLL这个宏是分条件的,取决于你有没有定义_USRDLL这个宏,如果你有,那么CC_DLL的意思是导出符号,如果你没有,那么CC_DLL的意思是导入别人的符号用。前面提到的extension因为是lib,所以没定义这个宏,所以是正常导入cocos2d的符号用,但是cocosdenshion定义了这个宏,因为人家是dll。所以解决方案是在include这个头文件前先把这个_USRDLL给undef,过后再重新define。
    5. 编出来的库需要属性一致才能链起来,之前我们有个库也是链接的时候死活说符号找不到,后来发现原因是一个是MultiThreadedDebug,一个是MultiThreadedDebugDLL。
    6. 每个库编出来都在自己的输出目录下面,为了避免设lib查找路径什么的,可以把输出目录改到solution下面。
    7. 还是前面这个问题,在vs2012里面,可以设置add reference某个库,这样他会自己把这个库找到并且给你用好,不用额外设依赖library,dependency和查找路径。
    8. 在试验上面这个东西的时候,发现如果某个lib用到了别的库,那么只要保证编译的时候头文件都在就行了,因为这时候并不会去链接,链接的那些设置只用在最后可执行的那个项目里设好就行。但是还是应该设置依赖关系因为这样才能保证那个库改变了之后这个库知道自己需要重编。
    9. 和上一点相关的,Mac上曾经在一个新库里面用到curl.a,结果死活找不到某几个符号,都绝望的以为版本不对准备从源代码重编了,最后观察到那些符号都是和压缩文件相关,才发现原来是curl里面用到zlib,是他们的符号找不到,所以在项目里面还需要依赖zlib。
  • 相关阅读:
    TCP/IP协议,,OSI的七层参考模型,HTTP请求响应机制
    火狐浏览器缓存导致JS已经改变的ID没改变
    Server.MapPath 出现未将对象引用设置到对象的实例
    线程池发送邮件的方法(向多个用户发送同一邮件)
    用多线程发送邮箱(一次给一个用户发送N封邮件)
    验证文本框输入内容类型是汉字
    名人博客
    tinyget
    内存分析
    Silverlight Forums
  • 原文地址:https://www.cnblogs.com/unionfind/p/3412979.html
Copyright © 2011-2022 走看看