xcode中接入第三方库,导致duplicate symbol报错

本文记录了在Xcode项目中接入第三方库时遇到的duplicate symbol错误及解决过程。首先尝试拆分静态库,但发现framework与静态库结构不同;接着排除系统库冲突的可能性;最后通过分析Demo和项目代码,发现是另一个第三方库引入了相同符号,移除相关代码后问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【xcode中接入第三方库,导致duplicate symbol报错】
duplicate symbol _OBJC_CLASS_$_SBJSON in:
    /Users/cldeer/Library/Developer/Xcode/DerivedData/FarmDay-fkwjxaxxooyqhigfylsjjxtgahkg/Build/Intermediates/FarmDay.build/Debug-iphoneos/FarmDay.build/Objects-normal/arm64/SBJSON.o
    /Users/cldeer/Documents/cocos2d-x-2.2.6/projects/FarmDay/proj.ios/Shephertz_App42_iOS_API.framework/Shephertz_App42_iOS_API
【尝试一】
网上比较普遍的做法是将静态库拆分为最小的obj文件,然后删除重复的obj,最后再重新打包
farmework虽然不是静态库,可以尝试一下
1、先找到第三方库文件(或framework),查看其支持的平台
cldeerdeMac-mini:A cldeer$ lipo -info Shephertz_App42_iOS_API 
Architectures in the fat file: Shephertz_App42_iOS_API are: i386 x86_64 armv7 arm64
2、分离出某个单独框架
cldeerdeMac-mini:A cldeer$ lipo -extract_family armv7 -output libv7.a Shephertz_App42_iOS_API
3、将单个框架的库解压,生成.o文件
cldeerdeMac-mini:A cldeer$ ar -x libv7.a 
ar: libv7.a: Inappropriate file type or format
【新问题】分解的库文件无法拆散,折腾好久才发现framework文件跟一般的静态库文件不同
这个是framework分解下来的non-fat库:
cldeerdeMac-mini:A cldeer$ file libv7.a 
libv7.a: Mach-O object arm
这个是静态库分解下来的non-fat库:
cldeerdeMac-mini:v7 cldeer$ file libv7.a 
libv7.a: current ar archive random library
zone.o是静态库分解下来的静态库再次分解产生的:
cldeerdeMac-mini:v7 cldeer$ file zone.o 
zone.o: Mach-O object arm
这个发现说明farmework分解下来的non-fat库跟普通静态库结构不同,直接就是最小单元了
4、到了这里,通过拆开库文件再次打包(libtool)的思路基本被堵死了
【尝试二】
由于代码中没有用到SBJSON.o而且在arm64目录下,断定是系统库所有
(大误区:普通代码生成的object文件就放在这个目录下,如果不是这个误解,问题应该开始【尝试一】早解决了)
App42使用比较广,如果是因为跟系统库冲突,官网上面应该有不少信息
不过最终在上面没找到任何相关的信息
【尝试三】
App42提供了Demo,可以看一下是不是有问题,如果有问题,就可以到官网上请求帮助了
运行Demo后,发现并没有问题(猜测可能是FarmDay工程支持了64位编译导致的)
查看Demo的工程文件,发现也是默认支持64位编译的,应该是之前的判断有问题了
最后检查一下FarmDay的工程文件,在IAP支付的代码中看到了SBJSON一系列的身影,
原来是另外一个第三方库也使用了这些对象,直接把相关代码从工程中移除。
重新编译,OK了
【总结】
这个问题有一定侥幸,如果真的是两个第三方framework冲突,估计要哭起来了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值