码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-10-30 12:23:54      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

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,也会出现这种问题。如果不能修改第三方的库代码,只能修改我信自己的代码了。

欢迎补充。

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

标签:

原文地址:http://www.cnblogs.com/bluev/p/4922811.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!