转自:http://www.cnblogs.com/rayshen/p/5160218.html

最近在开发项目时编译三方.a时出现了冲突,原因是存在duplicate symbol。

<1>模拟器编译时,应用的即时通讯模块采用的三方库(容联云),和视频监控模块采用的三方库(海康威视)之间有冲突,无法编译通过。

<2>真机编译时,假如对other linker flags设置为-ObjC,海康威视自身的两个.a文件存在冲突,假如不设置,CorePlot框架运行时会出现“selector not recognized”然后应用崩溃。

我真是头都大了啊……

可以看到在针对模拟器架构下(x86_64)的文件会产生如下编译错误:

这种情况一般都是文件里面使用C语言定义的全局变量名或是函数名,在导入的时候因为重复产生了冲突。

解决的方法:

1.对项目buildsetting里的other linker flags进行修改。

(参考下面的博客内容)

2.假如1不行,那只能重新打包三方库了。

(删除SDK内的重复的.o重新打包,详细见:http://blog.csdn.net/djl4104804/article/details/43099061)

other linker flags:

它的设置关乎到项目编译时的链接方式。

根据一篇博客内容顺便补脑下编译过程:

从C代码到可执行文件经历的步骤是:源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件

在最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令。源文件经过一系列处理以后,会生成对应的.obj文件,然后一个项目必然会有许多.obj文件,并且这些文件之间会有各种各样的联系,例如函数调用。链接器做的事就是把这些目标文件和所用的一些库链接在一起形成一个完整的可执行文件。Other linker flags设置的值实际上就是ld命令执行时后面所加的参数

下面逐个介绍3个常用参数:

-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中

-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,所以建议在遇到-ObjC失效的情况下使用-force_load参数。

-force_load:所做的事情跟-all_load其实是一样的,但是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载

对于出现的问题我们一个个分析。

Q1:为什么不加-ObjC时,CorePlot会崩,出现“selector not recognized”情况?

“-Objc这个标志,和Objective-C的一个重要特性:类别(category)有关。根据这里的解释,Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。”

简单的说就是,在没有添加-ObjC的情况下,某些静态库中的Category函数是没有被识别的,调用该函数时没找到这个函数的指针,就报错了。

Q2:真机编译,为什么加-ObjC时,海康自身的SDK会出现duplicate symbol冲突?

在加入-ObjC标志后,编译时会把所有OC文件都加载到可执行文件中,这样的情况下,假如海康有2个OC文件中都用到同一个名字命名的变量或函数,就会出现重复定义的编译错误。

Q3:如何解决有无-ObjC的矛盾?

使用-force_load加载特定的库。

所以,目前对于真机的编译问题我已经解决了,使用-force_load $(BUILT_PRODUCTS_DIR)/libCorePlot.a 以及-force_load $(PROJECT_DIR)/FuYang/Chat/YTX_iOS_IM_SDK_v5.1.6r/lib/libCCPiPhoneSDK_IMLib.a两条规则来加载特定的.a文件,防止他们的部分函数符号没建立的情况。

Q4:对于模拟器情况下两个库之间的.a文件冲突,有无解决办法?

假如对other linker flag都未设置,却出现了duplicate symbol的情况,那通过设置该标志只会让情况更糟糕。

建议对.a库重新打包,删除部分重复的symbol。

具体如何操作.a静态库可以参考这篇文章:http://blog.csdn.net/djl4104804/article/details/43099061

ios 重复引用 静态库_iOS 解决一个因三方静态库冲突产生的duplicate symbol的问题...相关推荐

  1. ios 重复引用 静态库_Swift 制作静态库

    Github地址:https://github.com/LINGLemon/LXFSwiftApp Swift不支持.a的静态库,因此只能制作.framework的静态库 动态库和静态库的区别 库: ...

  2. php不支持gd库,如何解决php不支持gd库的问题

    如何解决php不支持gd库的问题 发布时间:2020-07-24 16:50:14 来源:亿速云 阅读:128 作者:Leah 如何解决php不支持gd库的问题?很多新手对此不是很清楚,为了帮助大家解 ...

  3. android开发打开第三方库,Android开发NDK调用三方so库

    概要 在日常开发中,android NDK的作用无外乎有两种:一种是通过调用底层C/C++的算法,提高app的运行效率:另一种则是通过C/C++的特性,或者和驱动交互等,实现一些功能性的需求.接下来将 ...

  4. ios 重复引用 静态库_iOS项目引用静态库文件.a

    由于开发的项目中使用了静态库文件(.a文件),因此专门对它进行了简单的学习.静态库文件包装的是经常使用的公共代码,便于代码的复用. 1.生成静态库文件(static library file).主要包 ...

  5. ios 重复引用 静态库_iOS-如果静态库(.a)包含重复的目标文件(.o),会发生什么?

    AFAIK,较旧版本的Xcode如果链接了多次,则无法链接静态库.我认为存在一种重复的目标文件或符号问题. 最近,我意识到Xcode5不再在静态库的重复链接上报告相关错误.这是我的测试. >我写 ...

  6. 解决 Xcode下使用公用静态库,出现的Duplicate Symbol错误

    解决 Xcode下使用公用静态库,出现的"Duplicate Symbol"错误 分类: iPhone/iPad开发技术 2013-11-08 14:20  227人阅读  评论( ...

  7. PYTHON库,让你相见恨晚的第三方库

    转载自:https://www.cnblogs.com/duanlinxiao/p/9865240.html 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版 ...

  8. [HTML] Google IE-x.js 解决IEx与W3C标准的冲突

    如果分别用IE5.IE6.IE7浏览同一个网页,将可能出现不一样的效果. 这是它们之间对CSS的解析选择器不一样或错误和个别bug所导致.为了解决这些错误和bug. 我们不得不找到一个能平衡于它们之间 ...

  9. 链接器怎样使用静态库来解决符号引用

    链接器在根据命令行中输入的可重定位目标文件和静态库的顺序从左到右的扫描这些文件.在这个扫描中,链接器会维护一个集合E,该集合包含了将来要被合并生产可执行文件的所有可重定位目标文件:维护了一个集合U,包 ...

最新文章

  1. 【spring 5】AOP:spring中对于AOP的的实现
  2. .Net Base64编码
  3. Android Region代码分析
  4. python100个免费实例-Python实例100个(基于最新Python3.7版本)
  5. 高性能的索引实现——《深究MySQL》
  6. java lobo使用_[持续更新]Cobra:Java HTML parser用法详解
  7. 计算机高级技师论文网,高级技师论文(数控铣床、加工中心).doc
  8. PHP 7.1 新特性一览
  9. LINUX加载静态库so,取得函数地址并调用
  10. Lowest, highest?
  11. Linux文件内容查阅 - cat, tac, nl, more, less, head, tail, od
  12. 大鱼号自媒体如何快速通过试运营转正?
  13. 探讨一种新型的双进程守护应用保活
  14. 5GNR RIV计算
  15. 图片批量压缩工具软件免费版 Caesium Image Compressor
  16. 百度地图InfoWindow信息窗口的自定义和样式修改
  17. 还没量产的FF上市!贾跃亭:必须回国!这次,谁为他梦想“窒息”
  18. 【5G核心网】Packet Forwarding Model 数据包转发模型
  19. 快速蒙版应用——撕纸效果
  20. 在arcgis中线转面,原来的属性如何还原的问题

热门文章

  1. python向端口发出数据_Python写的简单的端口监听,显示端口上收到的数据,TCP的...
  2. python的flask找不到网页_掌握这几个网页制作小技巧,让你快速提高你的网站转化率...
  3. 普罗米修斯java_springboot集成普罗米修斯(Prometheus)的方法
  4. 移动端、微信小程序页面布局参考
  5. quartz定时器依赖_Grails集成Quartz插件实现定时任务(Job)
  6. odoo12 mysql_odoo12从零开始:二、1)个性化定制odoo12之修改数据库创建页面
  7. oracle删除后电脑卡,彻底删除oracle服务 -电脑资料
  8. matlab仿真图片png,Simulink仿真入门到精通(六) Simulink模型保存为图片
  9. php mysql 日期时间_php Mysql日期和时间函数集合
  10. 微电子学与计算机期刊投稿模板,微电子学与计算机投稿要求