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

来源:互联网 发布:面向对象数据库 编辑:程序博客网 时间:2024/06/05 16:08

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


http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73261868d462e8ec814c0735b36163bbca67772511993922f3116af3e1eb0b2217343457be18cc9fe49d8be94232f9c6269304a8917559147f49a15639637902ba8e446b7e7ae&p=aa798e5985cc43be08e2947d0e4a80&newp=8b2a9717ce981dff57ed977d4d089e231610db2151d4d1166b82c825d7331b001c3bbfb423231606d7c67c6000ab4858eef03278310025a3dda5c91d9fb4c57479da3f6f2c&user=baidu&fm=sc&query=duplicate+symbol&qid=e2b5593d000150d7&p1=1


duplicatesymbol是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在。但是经过一段时间的总结,发现这种错误总是有一些规律可以找的。

例如,我们有如下的最简单的两个类代码:


//  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



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


duplicatesymbol _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

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



欢迎补充。


http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73261868d462e8ec814c0735b36163bbca67772511993922f3116af3e1eb0b2217343457be18cc9fe49d8be94232f9c6269304a8917559147f49a15639637902ba8e446b7e7ae&p=aa798e5985cc43be08e2947d0e4a80&newp=8b2a9717ce981dff57ed977d4d089e231610db2151d4d1166b82c825d7331b001c3bbfb423231606d7c67c6000ab4858eef03278310025a3dda5c91d9fb4c57479da3f6f2c&user=baidu&fm=sc&query=duplicate+symbol&qid=e2b5593d000150d7&p1=1



原文地址:http://blog.ilovedev.com/blog/2013/12/31/duplicate-symbollian-jie-cuo-de-yuan-yin-zong-jie-he-jie-jue-fang-fa/

0 0
原创粉丝点击