请教库冲突的导致的 duplicate symbol .a链接错误

请教库冲突的导致的 duplicate symbol 链接错误 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
iOS 开发实用技术导航
NSHipster 中文版
cocos2d 开源 2D 游戏引擎
Google Analytics for Mobile 统计解决方案
Design Guides and Resources
Transcripts of WWDC sessions
Cocoa with Love
Cocoa Dev Central
iOS 开发实用书单
Style Guides
Useful Tools and Services
Sponsored by
国内领先的实时后端云野狗 API 可用于开发即时聊天、网络游戏、实时定位等实时场景传输快!响应快!入门快!
Promoted by
请教库冲突的导致的 duplicate symbol 链接错误
11:41:37 +08:00 · 5279 次点击
怀疑是使用的SDK和本身项目使用同一个库造成冲突.错误消息:duplicate symbol _DegreesToRadians in:
/Volumes/Store/NonPodVendor/ShareSDK/Extend/QQConnectSDK/TencentOpenAPI.framework/TencentOpenAPI(SetHeadImageViewController.o)Library/Developer/Xcode/DerivedData/Products/Debug-iphonesimulator/libPods.a(JCNotificationBannerPresenterIOSStyle.o)duplicate symbol _RadiansToDegrees in:
/Volumes/Store/NonPodVendor/ShareSDK/Extend/QQConnectSDK/TencentOpenAPI.framework/TencentOpenAPI(SetHeadImageViewController.o) Library/Developer/Xcode/DerivedDataBuild/Products/Debug-iphonesimulator/libPods.a(JCNotificationBannerPresenterIOSStyle.o)ld: 2 duplicate symbols for architecture i386clang: error: linker command failed with exit code 1 (use -v to see invocation)从上面的错误信息上看是不是ShareSDK中带的;Tencent的Framework中与项目引用了同一个开源项目JSNotificationBannerPresenter 造成了冲突,如果是的话,要怎么改才比较好呢?如果不是?是什么问题?
1 回复 &| &直到
11:59:41 +08:00
& & 11:59:41 +08:00
自己解决了,就贴下解决办法方便后来人吧.
查看了JCNotificationBannerPresenterIOSStyle源代码,
发现有冲突的是以下可能是由以下两个函数名,可能编译后编译器将名字加了_前缀.
CGFloat DegreesToRadians(CGFloat degrees) { return degrees * M_PI / 180.0; };
CGFloat RadiansToDegrees(CGFloat radians) { return radians * 180.0 / M_PI; };
可能是作为两个简单的函数,跟其他的函数冲突了吧.
我的做法时,不在使用cocoapods管理此库,而是下载下来做为项目的一部分,
然后修改源代码:
将上面的函数名更改一下:
CGFloat MyDegreesToRadians(CGFloat degrees) { return degrees * M_PI / 180.0; };
CGFloat MyRadiansToDegrees(CGFloat radians) { return radians * 180.0 / M_PI; };
然后编译就通过了!~
& · & 1072 人在线 & 最高记录 1856 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.7.3 · 48ms · UTC 07:07 · PVG 15:07 · LAX 00:07 · JFK 03:07? Do have faith in what you're doing.主题 : 两个第三方库冲突,怎么弄?duplicate symbol _base64_encode
级别: 侠客
可可豆: 776 CB
威望: 776 点
在线时间: 289(时)
发自: Web Page
两个第三方库冲突,怎么弄?duplicate symbol _base64_encode&&&
duplicate symbol base64encode in: ./TencentOpenAPI/TencentOpenAPI.framework/TencentOpenAPI(base64.o) ./ZBarSDK/libzbar.a(symbol.o)ld: 1 duplicate symbol for architecture i386clang: error: linker command failed with exit code 1 (use -v to see invocation)一个是腾讯分享,一个是条码扫描。看网上说可以合并两个库,谁有合并完的?或者改了的(libzbar.a)?能共享一份不?改_all_load不好使。
级别: 侠客
可可豆: 776 CB
威望: 776 点
在线时间: 289(时)
发自: Web Page
ZBarSDK 的源代码什么地方可以下载???
级别: 侠客
可可豆: 776 CB
威望: 776 点
在线时间: 289(时)
发自: Web Page
下载到了ZBarSDK原代码,可是里面并没有找到 _base64_encode。。可能是symbol.c引用来其他东西吧。。这回麻烦可大了。。 怎么解决这个问题呀???
级别: 新手上路
可可豆: 106 CB
威望: 58 点
在线时间: 198(时)
发自: Web Page
Lz解决了吗? 我也遇到了同样的问题i
级别: 侠客
可可豆: 776 CB
威望: 776 点
在线时间: 289(时)
发自: Web Page
回 3楼(4656587) 的帖子
下载源代码,改。。。
级别: 圣骑士
UID: 65410
可可豆: 1588 CB
威望: 1405 点
在线时间: 625(时)
发自: Web Page
Re:回 3楼(4656587) 的帖子
引用 引用第4楼freecunix于 02:59发表的 回 3楼(4656587) 的帖子 :下载源代码,改。。。 不用这么麻烦,直接打开库文件,把符号改成另外一个名字。
上善若水,无欲则刚
关注本帖(如果有新回复会站内信通知您)
3*3+1 正确答案:10
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版今天看啥 热点:
今天整合项目的时候, 遇到了这样一个问题。duplicate symbol _flag in:
/Users/apple/Library/Developer/Xcode/DerivedData/bluetoothPhone-fspknidhnizzjygmuqngfcklvnic/Build/Intermediates/bluetoothPhone.build/Debug-iphonesimulator/bluetoothPhone.build/Objects-normal/i386/DialVC.o
/Users/apple/Library/Developer/Xcode/DerivedData/bluetoothPhone-fspknidhnizzjygmuqngfcklvnic/Build/Intermediates/bluetoothPhone.build/Debug-iphonesimulator/bluetoothPhone.build/Objects-normal/i386/PersonalList.old: 1 duplicate symbol for architecture i386clang: error: linker command failed with exit code 1 (use -v to see invocation)分析一下, 如图。可以看出, 错误类型是 duplicate(重复) 错误标识是 _flag &错误位置在 DialVC 和 PersonalList中于是, 搜索一下, flag。发现...好了。 只要把其中一个改掉就好了。
相关搜索:
相关阅读:
相关频道:
Android教程最近更新网上流传了太多关于合并lib库的方法,自己也尝试过,但大多失败。有感于这种急于解决问题,经过百般尝试后依旧无果的无奈心情,小翁在这里用一个实例来完整阐述如何在mac中合并lib静态库。
这里以移动广告平台多盟的三个lib库为例子,之所以以此为例子,是因为我也遇到了库冲突的问题,所以才有了本文的内容。
本文的目标:合并libDomobOfferWallSDK.a、libDomobAdWallCoreSDK+UI.a、libDomobAdSDK.a
Let`s begin!
1.依次查看所有需要合并的lib库所支持的框架类型。i386表示支持iphone模拟器,armv6应用在iphone 3gs上,armv7应用在iphone4,armv7s应用在iphone4s以及iphone5,arm64应用在最新的iphone5s上。
lipo -info libDomobOfferWallSDK.a输出是:Architectures in the fat file: libDomobOfferWallSDK.a are: armv7 armv7s i386
看到红色粗体的fat了吗,fat file表示这个库里面合并了多于1个框架。
2.将lib库拆分出armv7、armv7s、i386类型的.a:
lipo -extract_family armv7 -output libDomobOfferWallSDK_arm.a libDomobOfferWallSDK.a
很多人会以为上面这条命令就可以一步到位分离出armv7版本,因为你显式地指出armv7了。但是,你错了。libDomobOfferWallSDK_arm.a仍旧是fat file,也就是里面含有了arm所有版本,这也是网上很多版本的教程错误的原因。如果误以为libDomobOfferWallSDK_arm.a只含armv7一个版本,则下一步的解.o操作就会失败,会提示"is a fat file"。小翁认为,最保险的做法是每次lib变化时都用lipo -info查看一下。现在我们查看一下libDomobOfferWallSDK_arm.a库:
lipo -info libDomobOfferWallSDK_arm.a
打印出:Architectures in the fat file: libDomobOfferWallSDK_arm.a are: armv7 armv7s
接着用如下命令进一步分离出单独的armv7、armv7s版本:(非常重要的步骤)
lipo libDomobOfferWallSDK_arm.a -thin armv7 -output libDomobOfferWallSDK_armv7_final.a
lipo libDomobOfferWallSDK_arm.a -thin armv7s -output libDomobOfferWallSDK_armv7s_final.a
而对于i386则不用上述那么麻烦,直接用第一句-extract_family指令就能分离出只含i386版本的库:
lipo -extract_family i386 -output libDomobOfferWallSDK_i386.a libDomobOfferWallSDK.a
经过上面操作后,我们得到了第一个待合并库libDomobOfferWallSDK.a 的armv7、armv7s、i386三个版本的库。剩下的两个待合并库同理。
3.分离出目标文件(.o)
进行实质上的合并。xcode里提示duplicate symbol都是说***.o与***.o冲突。注意,只有非fat file,也就是只含有单种版本的lib库才能分离出.o文件
ar -x ../libDomobOfferWallSDK_armv7_final.a
ar -x ../libDomobAdWallCoreSDK+UI_armv7_final.a
ar -x ../libDomobAdSDK_armv7_final.a
这一步最好是在lib*_final.a的同级目录下新建一个文件夹,专门用来接收解压出来的.o文件。同种版本(如armv7)的都解压到这个文件夹中,相同的.o文件他会自己覆盖掉。
4.从.o文件中合并成静态库:
libtool -static -o ../libDomobUniversal-armv7.a *.o
armv7s、i386版本同理。
5.合并成最终的通用静态库:
lipo -create -output libDomobUniversal.a libDomobUniversal-i386.a libDomobUniversal-armv7.a libDomobUniversal-armv7s.a
阅读(...) 评论()
我是来自厦门的Jilon. 翁,请关注我的微博:真实的weng,或关注微信:Jilon

我要回帖

更多关于 ios duplicate symbol 的文章

 

随机推荐