from:http://www.cocoachina.com/bbs/read.php?tid=177492

duplicate symbol是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在。但是经过一段时间的总结,发现这种错误总是有一些规律可以找的。
例如,我们有如下的最简单的两个类代码:

//  ClassA.h
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@end

//  ClassA.m
#import "ClassA.h"
@implementation ClassA
@end

//  ClassB.h
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
@end

//  ClassB.m
#import "ClassB.h”

@implementation ClassB
@end

编译后出现的错误信息如下:

duplicate symbol _OBJC_METACLASS_$_ClassA in:   
 /Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o   
 /Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.o
duplicate symbol _OBJC_CLASS_$_ClassA in:    /Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o    
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.old: 2 
duplicate symbols for architecture i386clang: 
error: linker command failed with exit code 1 (use -v to see invocation)

从上面出现问题的地方,我们应该能推测出是ClassA这个类出了问题。如果这个类是我们自己写的,就容易办一些。
可以考虑以下原因:
1.引入头文件时,由于疏忽,误引入.m文件。这种一般仔细检查一下出现问题的类的源文件就能发现。
例:ClassB.m 文件修改成下面这样

#import "ClassB.h>"
#import "ClassA.m” // 这句话有问题
@implementation ClassB
@end

2.同一个类,实现两次,即有两个@implementation 。这种一般会有一个警告,也比较容易发现。
例:ClassB.m文件修改成下面这样:

//  ClassB.m
#import "ClassB.h”
@implementation ClassB
@end
@implementation ClassA
@end

3.工程文件,同一个类文件被引入了两次,引起这种错误的原因大概有两种:一是多人协作开发时,导致project文件合并冲突;二是同名文件不在同一目录下,添加到工程时造成重复添加。 这种一般在文件视图,用名字过滤器检查一下就发现了。
4. Targets的Build Phase设置项里,查看Complie Sources这一项,看看出现问题的类是不是有重复的,用文件名过滤也比较容易发现。这种问题一般也是多人协作开发时,project文件冲突导致的。发现这种问题,只要删除就可以了。不过在我解决问题过程中,删除其中一个文件时,重复文件会自动全部删除,所以还需要单独添加一下。
5.如果我们的工程中引用了第三方的库,而恰好第三方的库里面有一个ClassA,也会出现这种问题。如果不能修改第三方的库代码,只能修改我信自己的代码了。

欢迎补充。

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

  1. Duplicate Symbol链接错的原因总结和解决方法

    Duplicate Symbol链接错的原因总结和解决方法 duplicate symbol(符号复制,即有相同的文件名)是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在.但是经过一段时 ...

  2. undefined reference to symbol xxxxx和undefined symbol:xxxx错误的原因分析以及解决方法

    Linux下编译程序时,经常会遇到"undefined reference to XXX" 报错,或者运行时出现undefined symbol:xxxx报错. 这里总结一些可能的 ...

  3. Segmentation fault段错误出现原因分析及解决方法笔记

    Segmentation fault段错误出现原因分析及解决方法 1.局部变量的大小过大,超过栈分配的空间导致段错误,如double a[500][500], 解决方法:大数据不要放在栈区中,可以考虑 ...

  4. 网站出现403 Forbidden错误的原因以及怎么解决的方法

    这几天刚接手一批新做的网站,在访问网站的时候,会时不时的出现403 Forbidden错误,浏览器会给出403 Forbidden错误提示,在打开Access Error中列出的URL之后, 出现以下 ...

  5. 动易2005、2006版常见错误号的原因分析及解决方法

    错 误 号:432 错误描述:File name or class name not found during Automation operation 错误来源:PE_Common6 原因分析:服务 ...

  6. linux连接mysql数据库出现1405错误原因的一些解决方法

    linux连接mysql数据库出现1405错误原因的一些解决方法 在使用yum于腾讯云服务器安装了mysql之后,从家里的电脑尝试连接mysql数据库的时候,就出现了1405错误,经过我不断地查找资料 ...

  7. mysql还原1418错误_MySQL 出现错误1418 的原因分析及解决方法

    MySQL 出现错误1418 的原因分析及解决方法 具体错误: 使用mysql创建.调用存储过程,函数以及触发器的时候会有错误符号为1418错误. ERROR 1418 (HY000): This f ...

  8. win10无法将设置应用到计算机,Win10提示应用无法在电脑上运行的原因及可行解决方法...

    Win10提示应用无法在电脑上运行的原因及可行解决方法 在Win10系统上安装软件,有时候会遇到系统提示此应用无法在你的电脑上运行.这问题有可能是软件和系统版本不匹配导致的,也有可能是兼容性问题导致的 ...

  9. 吃鸡系统服务器被拦截,绝地求生BE错误拦截系统文件怎么办?解决方法分享

    绝地求生BE错误拦截系统文件怎么办?解决方法分享 2017-11-10 15:39:10来源:游戏下载编辑:评论(0) <绝地求生大逃杀>中BE报错拦截系统文件怎么办?近日不少玩家都反映出 ...

最新文章

  1. mysql webservice接口_WebService接口在PHP中的使用
  2. 建立Full Trust的Browser Application
  3. c语言怎么编辑错题本,嵌入式错题本
  4. IOS网络框架的Alamofire5.4高版本网络工具封装
  5. java web购物车_java web开发——购物车功能实现
  6. html5网页制作代码_好程序员HTML5大前端常用开发工具大集合
  7. 指定跳转_炸裂!PPT能一键统一色彩,还能一键跳转到指定颜色
  8. Python学习-基础篇14 Web框架本质及第一个Django实例
  9. Linux基础和常用命令
  10. 计算机云文档,计算机的云计算论文.doc
  11. [转载] numpy.minimum
  12. ASCIIMathML技术简介~
  13. 比较完整的熊猫烧香解决方案
  14. 威纶通触摸屏232脚位_触摸屏通讯口(USB、RS232、RS422/485)的正确使用
  15. 创e下载园7edown.com(坑爹流氓网站大揭秘)
  16. python背景怎么自定义铃声_【Python成长之路】如何用2行代码将抖音视频设置成我的手机铃声...
  17. payjs 源码_ZFAKA发卡系统用宝塔安装详细图文教程+对接Payjs个人支付版本
  18. 有哪些免费的软件资源分享网站,软件资源网站大全导航
  19. useSSL=false or true如何抉择
  20. 计算机专业中职生自我鉴定报告,【中职生计算机自我鉴定】应届计算机毕业生自我鉴定...

热门文章

  1. SpringCloud 从菜鸟到大牛之四 应用通信 Feign Ribbon
  2. getSystemService
  3. linux 一次执行多条命令
  4. onsubmit=“return check() 给form加onsubmit 验证所有表单后再提交,可以用返回false 来阻止submit提交
  5. 虚拟化与Docker
  6. 设计模式---创建型模式
  7. 用户体验很棒的Git学习网站
  8. 面试问题背后的“猫腻”
  9. 基于centos6.5搭建redis伪分布式主备节点
  10. 如何打造应对超大流量的高性能负载均衡?