Duplicate Symbol连接错的缘由总结和解决方法

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,也会出现这种问题。若是不能修改第三方的库代码,只能修改我信本身的代码了。iphone

相关文章
相关标签/搜索