转--xcode duplicate symbol问题

遇到引用库重复定义的问题,需要解决。

项目需要,同时引用ZBar和QQ授权登录SDK,由于二者均使用了Base64处理数据,XCode编译时报错:

duplicate symbol _base64_encode in:

...\libzbar.a(symbol.o)

...\TencentOpenAPI(base64.o)

意思就是在这两个库中都定义了_base64_encode,编译器认为你重复定义了。至于为什么编译器认为重复定义,个人认为编译器编译全局变量时会根据名字进行编译,会把相同名称的全局变量编译为相同变量,也就是多个编译成一个,而编译器认为这样可能会引起错误,就提醒用户这里有错。

解决方案:

参考了:http://blog.sina.com.cn/s/blog_4beb28f301012bl6.html

删掉了 set building->other linker flag-> -all_load

ios的Framework是共享动态库,不会被打包到app中,非系统Framework静态库都会被打包到app中,所以会产生"Duplicate Symbol"的错误。
在Build Settings->Other link flags中删除所有的-all_load与-force_load, XCode会很smart的去掉"Duplicate Symbol"。

以下是从外国友人那获取的终极解决策略,方案是修改类库:

I‘m going to assume that these are two third party libraries that have only provided you with the .a files and not the source code. You can use libtool, lipo and ar on the terminal to extract and recombine the files.
假设有两个三方类库仅提供给你了.a文件,没有源码,你可以通过libtool, lipo和ar在terminal中解压合并他们。
To see what architectures are in the file:
查看文件都支持了什么架构
$ lipo -info libTapjoy.a
Architectures in the fat file: libTapjoy.a are: armv6 i386

Then to extract just armv6, for example:
然后只解压armv6,例如
$ lipo -extract_family armv6 -output libTapjoy-armv6.a libTapjoy.a
$ mkdir armv6
$ cd armv6
$ ar -x ../libTapjoy-armv6.a

You can then extract the same architecture from the other library into the same directory and then recombine them like so:
你可以从另一个类库中解压同样架构的部分,然后将两者合并在一起
$ libtool -static -o ../lib-armv6.a *.o

And then finally, after you‘ve done this with each architecture, you can combine them again with lipo:
如上所示,你可以将所有架构都按照这个流程走一遍,然后合并
$ cd ..
$ lipo -create -output lib.a lib-armv6.a lib-i386.a

This should get rid of any duplicate symbols, but will also combine the two libraries into one. If you want to keep them separate, or just delete the duplicate from one library, you can modify the process accordingly.

这个过程不仅解决掉了duplicate symbols的问题,也将两个类库合并为一个。如果你想分别保存两个类库,你可以将duplicate的部分从任意一个类库中删除,你可以相应的修改这个过程。

时间: 2024-11-22 17:11:38

转--xcode duplicate symbol问题的相关文章

【转】XCode: duplicate symbol 解决方案

遇到引用库重复定义的问题,需要解决. 项目需要,同时引用ZBar和QQ授权登录SDK,由于二者均使用了Base64处理数据,XCode编译时报错: duplicate symbol _base64_encode in: ...\libzbar.a(symbol.o) ...\TencentOpenAPI(base64.o) 意思就是在这两个库中都定义了_base64_encode,编译器认为你重复定义了.至于为什么编译器认为重复定义,个人认为编译器编译全局变量时会根据名字进行编译,会把相同名称的

xcode引入第三方静态类库 duplicate symbol _OBJC_XXX 重复编译错误

一:场景 xcode 同时引入了 libA.a, libB.a 两个静态类库,如果 这两个静态类库之中,都打包了,相同的库,方法之类的, 且 xcode 的 other link flag 为 -all_load 时,就会出现 上述 静态类库,重复编译错误: 二:解决方法 1:把xcode 的 other link flag 里面的 -all_load 去掉:有 force-load 的也去掉: 2:第二个办法是 把 libA.a ,libB.a 里面的 冲突 内容 在任意一方的 libxx.a

xcode 的duplicate symbol xx问题

今天在写程序的时候遇到一个奇葩问题. 前N表,我的应用都可以编译并且运行.后一秒突然无法编译通过,通过查看报错信息,发现是duplicate symbol xx问题,问题出现在连接的时候. why?? 首先字面意思就是重复定义了.(但为什么前面可以编译通过不报错?乔布斯,你给我活过来,我保证不打死你!) 其实解决的办法很简单,全文查找这个 XX.你会发现连接错误提示的几个文件里,都定义了这个变量.(我局部变量(写在.m里的,这是局部变量吗?我是菜鸟,至少实例访问不到的)都能连接出错??).然后你

xcode上编译c语言程序报错:ld: x duplicate symbol for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

在网上查了一下: duplicate symbol的大概意思是,编译器认为你重复定义了一些东西. linker command failed with exit code 1,则可能是项目引入了多个相同的文件. 结合本人开发中发现此类的问题,解决办法如下: 方法1:查看有问题的文件是否有重复引用.或头文件是否加载了.m 方法2:将有问题的文件删除,重新加载进去.然后:clean->build. 在开发中解决RegexKitlLite的类似问题办法: _rkl_NSExceptionForRege

ios 中 使用自制framework导致 Duplicate symbol 的问题解决方法

使用第三方静态库的时候有时候要求在编译选项linker 中 other linker flag中加入 -ObjC 但如果自制的framework库工程中加入了-ObjC,在Demo工程中如果也加入-ObjC选项时,可能导致 duplicate sysbol的问题 duplicate symbol _OBJC_CLASS_$_ZHAlixPayResult in: /Users/zizhu/Library/Developer/Xcode/DerivedData/NtUniSdkHaiMaDemo-

iOS duplicate symbol _main in:问题解决

今天手贱给自己挖了个坑,由于工程中一些文件是后台的小伙伴写的C/C++文件,所以我一次性全部导入了,但是编译时出现了duplicate symbol _main in: A.o和B.o的编译错误. 下面写一个最简单的Demo还原这个情景. 新建一个工程,再新建Hello.h和Hello.c文件,代码如下: Hello.h #ifndef __Main__Hello__ #define __Main__Hello__ #include <stdio.h> int main(); #endif /

Duplicate Symbol链接错误的原因总结和解决方法[转]

from:http://www.cocoachina.com/bbs/read.php?tid=177492 duplicate symbol是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在.但是经过一段时间的总结,发现这种错误总是有一些规律可以找的.例如,我们有如下的最简单的两个类代码: //  ClassA.h#import <Foundation/Foundation.h>@interface ClassA : NSObject@end //  ClassA.m#impor

iOS开发 - OC - duplicate symbol _OBJC / undefind symbol 错误的相关处理

前言: 作为一个iOS开发,相信大家都会遇到类似于 “duplicate symbol” 的程序报错. 对于很多新手来说,可能会有点手足无措,因为这种类型的报错一般并非是代码的逻辑错误,大部分情况下是在编译过程出错导致的,因此相对来说排查不易.在前几天,我在引用了两个SDK的过程中出现了这个问题,运用不同的手段最终解决了这个问题.今天本文就这个错误进行一个详细的分析以及如何处理做一个探讨,如果有错误的地方还请指出. 一.duplicate symbol /undefind  symbol出现的原

duplicate symbol _OBJC_CLASS 错误处理方法

错误: ld: duplicate symbol _OBJC_CLASS_$_************ in **************** 一种可能性是项目的不同group里有着相同名称的类 第二种很难找的: xcode的自动完成特性,在你导入头文件的时候,将".h"补成了".m"