解决iOS第三方SDK与本地静态库之间重复的symbols问题
来源:互联网 发布:水量伺服器 知乎 编辑:程序博客网 时间:2024/06/06 10:49
之前发表过一个第三方SDK之间重复symbols的问题,这次其中一个冲突对象换成了本地函数,因为引入的第三方(不用看,高德地图就是你!)封装时没有将其特殊符号封装起来,导致链接时产生符号重复,如下图所示:
这里有两个重复的symbols,分别是_unz_copyright和_zip_copyright,解决方法好明显不能动本地的链接文件(动了也没用,每次编译还是会自动生成),所以只好从MAMapKit中下手,方法如下:
1.MAMapKit.framework中的MAMapKit拷贝到桌面,然后打开终端并用指令”cd desktop”切换到桌面,如下图:
桌面:
终端界面:
先用lipo -info MAMapKit
指令看看MAMapKit有什么类型的包,操作如下:
这是一个fat file,包含类型armv7,i386,x85_64和arm64这4种类型的文件,再结合本文第一张报错图,可以发现重复的只是arm64这个类型的文件,故只需分离出arm64文件即可。
使用指令 lipo -thin arm64 MAMapKit -output MAMapKit.arm64
可以从MAMapKit中拷贝出类型为arm64的文件,命名为MAMapKit.arm64,如下图:
桌面可以看到多出来文件MAMapKit.arm64:
用指令nm -j MAMapKit.arm64 | grep zip > symbols
获取MAMapKit.arm64文件中以_zip为前缀的所有符号,生成符号列表并存于symbols文件中。( -j 选项控制只输出符号名),如下图
再看看桌面可以发现多了个symbols文件
打开如下:
又因为本次除了_zip_copyright命令外,还有一个_unz_copyright命令的冲突,故直接在symbols文件中添加_unz_copyright指令如下图
添加完成后,用指令ar -x MAMapKit.arm64
将MAMapKit.arm64文件分解成3个文件如下图
桌面多出来的3个文件如下:
用指令ld -x -r -unexported_symbols_list symbols MAMapKit-arm64-master.o -o MAMapKit-arm64-master.o.strip可将symbols文件中的符号列表在MAMapKit-xarm64-master.o文件中删除掉,并生成一个新的文件MAMapKit-x86_64-master.o.strip,过程如下图
最后将删除了重复符号的文件和原来的另外两个文件合并,命令是ar -r MAMapKit.arm64 MAMapKit-arm64-master.o.strip Pods-MAMapKit-dummy.o
,在合成之前先将原来的15.8M大小的MAMapKit.arm64移走,步骤如下
桌面:
可以看到新生成的MAMapKit.arm64大小为15.6M,说明删除了重复符号后瘦身了些许
最后再将新生成的MAMapKit.arm64替换了原来MAMapKit中arm64类型的文件,指令为lipo MAMapKit -replace arm64 MAMapKit.arm64 -output MAMapKitTest
如下图:
桌面如下:
可以看到新生成的MAMapKitTest文件也比原来的MAMapKit小了0.2M的大小,说明重复部分已删除。
最后将MAMapKitTest改名为MAMapKit,并替换MAMapKit.framework中的MAMapKit即可引入工程
- 解决iOS第三方SDK与本地静态库之间重复的symbols问题
- 解决 iOS 第三方 SDK 之间重复的 symbols 问题
- Undefined symbols for architecture i386与第三方编译的静态库有关
- iOS "duplicate symbol"解决第三方库之间的冲突
- IOS解决某些第三方静态库在真机无法运行的问题
- iOS 平台 Cocos2d-x 项目 接入第三方SDK 的坑(就是静态库接入的问题)
- iOS将多个第三方sdk打包成静态库
- 制作静态库 第三方SDK
- 制作静态库 第三方SDK
- 制作静态库 第三方SDK
- 解决第三方静态库不适配ARM64问题
- iOS 静态库SDK制作过程嵌套第三方静态库
- iOS静态库SDK制作(包含第三方静态库)
- iOS静态库SDK制作(包含第三方静态库)
- 第三方的静态库出现错误的解决
- iOS 制作静态库 .a 文件 和 .framework 文件 以及解决第三方库冲突问题 (转载 mark 一下)
- 添加静态库到android out目录,解决加入第三方依赖静态库的依赖问题
- iOS 解决一个因三方静态库冲突产生的duplicate symbol的问题
- Android内存优化总结&实践
- 另一个程序正在使用此文件,进程无法访问
- 解决opencv无法在图片上添加中文的问题。
- Java面向对象设计模式(三)——单例模式
- 使用Webpack创建vue的tab选项
- 解决iOS第三方SDK与本地静态库之间重复的symbols问题
- 加密算法及概念
- Boost.Interprocess使用手册翻译之六:同步机制(Synchronization mechanisms)
- 等比数列二分求和(首项为0次项与1次项的方法)
- toLowerCase方法
- OSI参考模型中的数据封装及解封装过程
- javascript设计模式之装饰器模式(结构型模式)
- 机器学习-高斯模型
- 如何解决安卓项目报65536错误