iOS-解决Duplicate Symbol编译错误

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
2
3
lipo -extract_family armv7 名字.a -output armv7.a
lipo -extract_family x86_64 名字.a -output x86_64.a
...

完成后,用lipo -info命令验证一下是否分解成功:

1
lipo -info armv7.a

结果为:

1
2
input file armv7.a is not a fat file
Non-fat file: armv7.a is architecture: armv7

说明分解成功。如果出现依然是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
2
cd ./armv7
ar -x ../armv7.a

可以看到文件夹中存放了所有的.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编译错误解决。