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

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

1 // ClassA.h
2 #import
3 @interface ClassA : NSObject
4 @end
5
6 // ClassA.m
7 #import "ClassA.h"
8 @implementation ClassA
9 @end
1 // ClassB.h
2 #import
3 @interface ClassB : NSObject
4 @end
5
6 // ClassB.m
7 #import "ClassB.h”
8 @implementation ClassB
9 @end

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

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

从上面出现问题的编译日志中,我们看到有ClassA字样,基本能推测出是ClassA这个类出了问题。如果这个类是我们自己写的,就容易办一些。下面列兴了一些可能引起这个问题的情况。

1.引入头文件时,由于疏忽,误引入.m文件。这种一般仔细检查一下出现问题的类的源文件就能发现。
例如:ClassB.m 文件修改成下面这样

1 #import "ClassB.h"
2 #import "ClassA.m” // 这句话有问题,会导致链接错误。去掉它,或者改成.h就好了
3
4 @implementation ClassB
5 @end

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

1 // ClassB.m
2 #import "ClassB.h”
3
4 @implementation ClassB
5 @end
6 @implementation ClassA
7 @end

3.工程文件,同一个类文件被引入了两次,引起这种错误的原因大概有两种:一是多人协作开发时,导致project文件合并冲突;二是同名文件不在同一目录下,添加到工程时造成重复添加。 这种一般在文件视图,用名字过滤器检查一下就发现了。

4.Targets的Build Phase设置项里,查看Complie Sources这一项,看看出现问题的类是不是有重复的,用文件名过滤也比较容易发现。这种问题一般也是多人协作开发时,project文件冲突导致的。发现这种问题,只要删除就可以了。不过在我解决问题过程中,删除其中一个文件时,重复文件会自动全部删除,所以还需要单独添加一下。

5.如果我们的工程中引用了第三方的库,而恰好第三方的库里面有一个ClassA,也会出现这种问题。如果不能修改第三方的库代码,只能修改我信自己的代码了。

欢迎补充。

时间: 2024-12-25 18:53:55

Duplicate Symbol链接错的原因总结和解决方法的相关文章

(转)Duplicate Symbol链接错的原因总结和解决方法

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

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

Android NDK报错(Eclipse)及解决方法

在AndroidNDK开发过程中,工程目录下的jni文件夹下编写的c/c++代码,通常会出现如下的几种类型的报错: 1.Unresolved inclusion:<XXX> 2.syntax error 3.Function 'XXX' could not be resolved 4.Type 'XXX' could not be resolved 5.Symbol 'XXX' could not be resolved 6.Method 'XXX' could not be resolved

IIS7报500.23错误的原因分析及解决方法

这篇文章主要介绍了IIS7报500.23错误的原因分析及解决方法的相关资料,需要的朋友可以参考下背景:今天公司终端上有一个功能打开异常,报500错误,我用Fiddler找到链接,然后在IE里打开,报500.23错误:检测到在集成的托管管道模式下不适用的ASP.NET设置.后台是一个IIS7和tomcat7集成的环境,此处记录一下. HTTP 错误 500.23 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 为什么会出现以上错误? 在

Windows变慢原因分析及解决方法

<p>Windows变慢原因分析及解决方法  <br/> <br/> <br/> <br/> 谁都希望计算机一开机就可以立即进入Windows 系统而不用等待,或者是系统在使用的时候不会越来越慢,但由于种种原因常常使这些愿望不能实现,甚至一开机就死机或者用着用着就越来越慢的情况也经常发生.其实有些时候Windows 启动速度缓慢并不是它本身的问题,而是一些设备或软件造成的.本文就是软件.硬件和病毒三大方面来分析系统速度变慢的原因,并且提供了针对系

使用IDEA在引入Schema空间时报错URI is not registered解决方法以及Idea @Autowired取消提示 方法

使用IDEA在引入Schema空间时报错URI is not registered解决方法以及Idea @Autowired取消提示 方法   Idea @Autowired取消提示 spring bean通过@Autowired注入,spring auto scan配置,在编辑情况下,无法找不到对应的bean,于是提示找不到对应bean的错误. 但build项目是能正常运行的. 可在File – Settings – Inspections.在Spring Model – Autowring

网站内容不被百度收录的原因反思及解决方法!

大发迹创业项目网有个网站百度已经没有一个月收录,站长也是着急,于是想着应该怎么解决这个问题.其实网站出了问题,站长应该是最清楚的,所以不要急,仔细回想一下最近操作了什么,然后一个一个去排查就可以找出问题所在,对症下药就ok了. 比如我的这个网站,想要找出问题所在就很简单.回想一下网站也没有做什么优化,建成之后就是单纯的发布内容,网站主要是推荐一些小项目,围绕着项目写文章. 网站几乎是天天更新,终于没有灵感,不知道怎么写了,就开始犯愁了.某一天灵机一动,想着以项目推项目,利用其它的项目来推荐自己操

ORACLE EXP不能导出空表的原因分析及解决方法

一.不能导出空表的原因 1.Oracle11g默认对空表不分配segment,故使用exp导出Oracle11g数据库时,空表不会导出. 2.设置deferred_segment_creation 参数为FALSE后,无论是空表还是非空表,都分配segment. 在sqlplus中,执行如下命令: SQL>alter system set deferred_segment_creation=false; 查看: SQL>show parameter deferred_segment_creat

2018年1月12日--微信小程序----出错报告(40kb的原因)---并解决方法

一. 报错的原因是因为,图片的文件太大了,已经超过了40kb...不能超过40kb. 在这里查看图片文件的大小: 原文地址:https://www.cnblogs.com/yuyu1993/p/8276343.html