天天看点

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

#import "classa.h"

@implementation classa

//  classb.h

@interface classb : nsobject

//  classb.m

#import "classb.h”

@implementation classb

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

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” // 这句话有问题

2.同一个类,实现两次,即有两个@implementation 。这种一般会有一个警告,也比较容易发现。

例:classb.m文件修改成下面这样:

//  classb.m

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

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

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

欢迎补充。

欢迎加群互相学习,共同进步。qq群:ios: 58099570 | android: 330987132 | go:217696290 | python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/4181208.html