1. 问题描述
duplicate symbol(重复,相同的文件名)
是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在。但是经过这种错误提示,会潜意识的反射出是文件重复了。
一般出现的原因:
- 工程文件,同一个类文件被引入了两次
这种一般在文件视图,用名字过滤器检查一下就发现了。 - Targets的Build Phase设置项里会出现重复
Targets的Build Phase设置项,查看Complie Sources这一项,看看出现问题的类是不是有重复的,如果重复,project文件冲突导致的。出现这种问题,只要删除就可以了。 - 引入第三方库时与工程的文件重名冲突
如果我们的工程中引用了第三方的库或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 解决步骤
- 创建临时文件夹: 用于存放armv7平台解压后的.o文件:
mkdir armv7
- 从.a中取出armv7平台的包:
lipo libx.a -thin armv7 -output armv7/libx-armv7.a
- 查看armv7平台的包中所包含的文件列表:
ar -t armv7/libx-armv7.a
- 从armv7平台的包中解压出object file(即.o后缀文件):
cd armv7 && ar xv libx-armv7.a
- 找到冲突的包:
rm Temp.o
- 重新打包object file(armv7平台包):
cd .. && ar rcs libx-armv7.a armv7/*.o,
- 将其他几个架构包逐一做上述[1-6]操作
- 重新合并为fat file的.a文件:
lipo -create libx-armv7.a libx-arm64.a -output libTemp.a
3. 写在最后
上述的方法并没有解决掉我的问题,因为是两个第三方库都是出自一个公司,只是版本和功能稍微有点不一样,用户想在保留旧版本功能同时加入新版本功能,因此造成的这个冲突,不管删除哪个定义的方法都会出现未定义方法
的问题。
4. 学习
学习了lipo的基本命令,想了三种方式去解决问题,逐一操作均失败。最近文章更新的慢,也确实学到了东西,一直没时间更新,只能通过日记形式每天记录一下,等有空了再补充完