iOS系统解决Duplicate Symbol编译错误。
出现Duplicate Symbol编译错误,原因都是项目中包含了重名的类,在编译时生成了多个重名的.o文件,解决的方法也比较简单,直接删除其中一个,或者改名就可以了。但是,如果是在两个第三方的.a文件中出现上述情况,则比较复杂,需要对其中一个进行删减重名文件,步骤如下:
查看.a文件支持的ARM
在命令行中用以下命令查看:
1 | lipo -info 名字.a |
可以看到结果:
1 | Architectures in the fat file: 名字.a are: armv7 arm64 |
这里的fat file说明.a文件是支持多个ARM的。
分解成支持单ARM的.a文件
对于fat file,我们需要将其分解成不同ARM的.a文件,命令如下:
1 | lipo -extract_family armv7 名字.a -output armv7.a |
完成后,用lipo -info命令验证一下是否分解成功:
1 | lipo -info armv7.a |
结果为:
1 | input file armv7.a is not a fat file |
说明分解成功。如果出现依然是fat file的情况,需要对其进行进一步裁剪,命令如下:
1 | lipo armv7.a -thin armv7 -output armv7Final.a |
这里,还需要注意的是,arm64比较特殊,需要直接使用裁剪命令生成,如果直接用extract_family命令,生成的.a会出现下述现象:
1 | fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't figure out the architecture type of: arm64.a |
完成后,可以看到,在该文件夹下,已经分解成了对应的.a文件。
从.a文件中分解出所有的.o文件
先新建一个名称为armv7的文件夹,以便存放所有的.o文件,然后执行命令:
1 | cd ./armv7 |
可以看到文件夹中存放了所有的.o文件,从中找出重名的.o文件,将其删除。完成后,重新打包成.a文件:
1 | libtool -static -o ../armv7_new.a *.o |
新生成的.a文件,就是已经删除了重名.o文件的.a文件了。对上一步上成的.a文件重复上述操作,可以得到所有的新生成的.a文件。
合并所有裁剪后的.a文件
命令如下:
1 | lipo -create -output new.a armv7_new.a arm64_new.a |
将合并后的.a文件加到项目中编译,Duplicate Symbol编译错误解决。