iOS开发——"duplicate symbol"解决静态库之间的冲突

1. 问题描述

duplicate symbol(重复,相同的文件名)

是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在。但是经过这种错误提示,会潜意识的反射出是文件重复了。
一般出现的原因:

  1. 工程文件,同一个类文件被引入了两次
    这种一般在文件视图,用名字过滤器检查一下就发现了。
  2. Targets的Build Phase设置项里会出现重复
    Targets的Build Phase设置项,查看Complie Sources这一项,看看出现问题的类是不是有重复的,如果重复,project文件冲突导致的。出现这种问题,只要删除就可以了。
  3. 引入第三方库时与工程的文件重名冲突
    如果我们的工程中引用了第三方的库或pod入第三方库时,而恰好第三方的库里面有一个,也会出现这种问题。
    上述三个问题都还好解决,但是当引用两个静态库中出现重复定义问题该怎么办。

2. 解决两个三方库之间的问题

2.1 查看静态库所支持的架构

打开终端输入如下命令: 
第一步: cd 工程目录(静态库所在位置目录)
第二部: lipo -info temp.a 
输出结果: Architectures in the fat file: temp.a are: armv7 arm64

如果提示fat file,那么代表这个包是支持多平台的,例如armv7,armv7s,i386等,这需要我们逐一做解包重打包操作。以armv7架构做例子:

2.2 解决步骤

  1. 创建临时文件夹: 用于存放armv7平台解压后的.o文件:
    mkdir armv7
  2. 从.a中取出armv7平台的包:
    lipo libx.a -thin armv7 -output armv7/libx-armv7.a
  3. 查看armv7平台的包中所包含的文件列表:
    ar -t armv7/libx-armv7.a
  4. 从armv7平台的包中解压出object file(即.o后缀文件):
    cd armv7 && ar xv libx-armv7.a
  5. 找到冲突的包:
    rm Temp.o
  6. 重新打包object file(armv7平台包):
    cd .. && ar rcs libx-armv7.a armv7/*.o,
  7. 将其他几个架构包逐一做上述[1-6]操作
  8. 重新合并为fat file的.a文件:
    lipo -create libx-armv7.a libx-arm64.a -output libTemp.a

3. 写在最后

上述的方法并没有解决掉我的问题,因为是两个第三方库都是出自一个公司,只是版本和功能稍微有点不一样,用户想在保留旧版本功能同时加入新版本功能,因此造成的这个冲突,不管删除哪个定义的方法都会出现未定义方法的问题。

4. 学习

学习了lipo的基本命令,想了三种方式去解决问题,逐一操作均失败。最近文章更新的慢,也确实学到了东西,一直没时间更新,只能通过日记形式每天记录一下,等有空了再补充完

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值