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

来源:互联网 发布:怎么看python安装的库 编辑:程序博客网 时间:2024/06/05 23:51
【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冲突,估计要哭起来了
0 0
原创粉丝点击