操作步骤
静态库一般是Fat library, 先查看静态库都包含哪些CPU架构。
1 | >> lipo -info libSGTTSLib.a |
模拟机是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 | >> nm -j matlabfunctions.o |
通过 ld
命令,去掉其中的 _diff
符号,生成一个新的.o文件,再替换之前的 matlabfunctions.o
1 | ld -x -r -unexported_symbol _diff matlabfunctions.o -o new.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