Kevinlma的博客

物来顺应,未来不迎,当时不杂,既过不恋

0%

两个第三方库符号冲突问题解决

操作步骤

静态库一般是Fat library, 先查看静态库都包含哪些CPU架构。

1
2
>> lipo -info libSGTTSLib.a
Architectures in the fat file: libSGTTSLib.a are: i386 armv7 armv7s x86_64 arm64

模拟机是x86_64、真机现在用的是arm64和armv7

先拆分出每个架构对应的lib,以arm64为例:

1
>> lipo -thin arm64 libSGTTSLib.a -o arm64.a

再将静态库 arm64.a 解压缩,释放出所包含的所有object文件

1
ar -x arm64.a

由于之前在项目编译中,根据报错信息,可以知道是 matlabfunctions.o 中的 _diff 符号冲突了,所以针对这个.o文件进行处理。可以查看符号

1
2
3
4
5
>> nm -j matlabfunctions.o

__ZN12_GLOBAL__N_117FilterForDecimateEPKfiiPf
_diff
...

通过 ld 命令,去掉其中的 _diff 符号,生成一个新的.o文件,再替换之前的 matlabfunctions.o

1
2
3
4
ld -x -r -unexported_symbol _diff matlabfunctions.o -o new.o

rm matlabfunctions.o
mv new.o matlabfunctions.o

之前将所有的.o再重新打包,生成 arm64 架构下新的静态库

1
ar -r new64.a *.o

再将其他涉及的几个架构都如法炮制,生成其相应新的静态库。最后用这些新的静态库,替换原 Fat library 中各个架构下的库,生成一个新的 Fat library

1
lipo libSGTTSLib.a -replace x86_64 newx86.a -replace arm64 new64.a -replace armv7 newv7.a -output newtts.a

用这个新的库,在在Pod库中替换原先的 libSGTTSLib.a 重新编译,可以顺利通过了~

问题记录

在调研过程中,nm命令的使用耽误了不少时间。在对 arm64 架构的静态库去符号后,一直都是用 nm -j new.o | grep _diff 来判断符号是否正确去掉了。这个方法对 x86_64 架构是好使的,但是对 arm64 架构,每次去符号后,还是能 grep_diff ,所以一度认为去符号失败了,几乎放弃这种方法。但是后来用 MachoView 工具查看 new.o 时,发现符号表中 _diff 没有了。抱着尝试的态度,将新的new.o打包并做成最终的静态库,之后放到项目中去试,发现编译竟然通过了。还是挺费解的,后续有时间再研究一下为什么。

refer

https://www.jianshu.com/p/1dd5643df88c
https://www.jianshu.com/p/e857730015cf