美文网首页
集成SDK报错 duplicate symbols for ar

集成SDK报错 duplicate symbols for ar

作者: Leoeoo | 来源:发表于2021-05-07 20:57 被阅读0次

此文是编译原理的验证,具体原理后续再写。

发生报错的情况是:同一个类中同时引用了重复类。

第一种情况

项目中不止一次引入相同的类:


image.png

编译会报错:


image.png

解决方案:
移除多余的类。

第二种情况

引入了第三方静态库SDK,第三方SDK中的类名与自己项目中类名重复。

前提:
假设重复的类名为:FHStaticObj
假设 ViewController 引入该重复类。

情景1

假设重复类的声明(.h 方法名)都一致。
1.同一个类中先引入项目中的FHStaticObj,再引入三方SDK中的<static/FHStaticObj.h>

引入顺序为:

#import "FHStaticObj.h"
#import <static/FHStaticObj.h>

不会报错,执行项目中FHStaticObj的实现。

2.同一个类中先引入三方SDK中的<static/FHStaticObj.h>,再引入项目中的FHStaticObj

引入顺序为:

#import <static/FHStaticObj.h>
#import "FHStaticObj.h"

会报错Duplicate interface definition for class 'FHStaticObj',此时有三种处理方案:

  • 1.(不删除项目中的FHStaticObj)只引入SDK中的类import <static/FHStaticObj.h>
    执行项目中FHStaticObj的实现。
  • 2.(不删除项目中的FHStaticObj)只引用项目中的类#import "FHStaticObj.h"
    执行项目中FHStaticObj的实现。
  • 3.(删除项目中的FHStaticObj),引入SDK中的类import <static/FHStaticObj.h>
    执行三方SDK中<static/FHStaticObj.h>的实现。

情景2

假设重复类的声明(.h 方法名)不一致。
1.同一个类中先引入项目中的FHStaticObj,再引入三方SDK中的<static/FHStaticObj.h>
#import "FHStaticObj.h"
#import <static/FHStaticObj.h>

会报错:'FHStaticObj' has different definitions in different modules; first difference is defined here found method

2.同一个类中先引入三方SDK中的<static/FHStaticObj.h>,再引入项目中的FHStaticObj
#import <static/FHStaticObj.h>
#import "FHStaticObj.h"

会报错:Duplicate interface definition for class 'FHStaticObj'

3.只引入项目中的FHStaticObj

不会报错,且会执行项目中FHStaticObj的实现。
如果把项目中FHStaticObj删除,会报错。

4.只引入三方SDK中的<static/FHStaticObj.h>

不会报错,且会执行项目中FHStaticObj的实现。
如果把项目中FHStaticObj删除,也不会报错。

第三种情况

引入了两个第三方SDK静态库:staticA.frameworkstaticB.framework。且两个SDK中包含相同的类FHStaticObj

1.同一个类中引入staticA.frameworkstaticB.framework
#import <staticA/FHStaticObj.h>
#import <staticB/FHStaticObj.h>

#import <staticB/FHStaticObj.h>
#import <staticA/FHStaticObj.h>

此时,具体执行哪个SDK里面的代码与头文件的引入顺序无关。与Build PhasesLink Binary With Libraries中SDK加载顺序有关。

image.png

第四种情况

引入了两个第三方SDK:静态库:staticA.framework,动态库:dynamic.framework。且两个SDK中包含相同的类FHStaticObj
此时,具体执行哪个SDK里面的代码与头文件的引入顺序无关。与Build PhasesLink Binary With Libraries中SDK加载顺序有关。

image.png

第五种情况

引入了两个第三方SDK动态库:dynamicA.frameworkdynamicB.framework。且两个SDK中包含相同的类FHStaticObj
此时,具体执行哪个SDK里面的代码与头文件的引入顺序无关。与Build PhasesLink Binary With Libraries中SDK加载顺序有关。
且控制台都会有警告。

第六种情况

引入了两个第三方SDK静态库:staticA.astaticB.framework。且两个SDK中包含相同的类FHStaticObj
如果同时都引入两个SDK的头文件,会报错。处理方案:只引用一个头文件,此时,具体执行哪个SDK里面的代码与头文件的引入顺序无关。与Build PhasesLink Binary With Libraries中SDK加载顺序有关。最彻底的解决方案是移除一个SDK中的FHStaticObj
控制台没有警告。

第七种情况

引入了两个第三方SDK:静态库:staticA.a, 动态库:dynamicB.framework。且两个SDK中包含相同的类FHStaticObj
如果同时都引入两个SDK的头文件,会报错。处理方案:只引用一个头文件,此时,具体执行哪个SDK里面的代码与头文件的引入顺序无关。与Build PhasesLink Binary With Libraries中SDK加载顺序有关。最彻底的解决方案是移除一个SDK中的FHStaticObj
动态库在下时,控制台有警告。

相关文章

网友评论

      本文标题:集成SDK报错 duplicate symbols for ar

      本文链接:https://www.haomeiwen.com/subject/oslddltx.html