博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Duplicate Symbol链接错误的原因总结和解决方法[转]
阅读量:5872 次
发布时间:2019-06-19

本文共 2308 字,大约阅读时间需要 7 分钟。

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

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/4181208.html
你可能感兴趣的文章
三种样式表
查看>>
Eclipse 常用快捷键(动画讲解)
查看>>
python pandas 数据处理
查看>>
[Learn AF3]第七章 App framework组件之Popup
查看>>
Java SE 第二十三讲----static关键字and final关键字
查看>>
微信小程序开发的游戏《拼图游戏》
查看>>
Hibernate-Criteria
查看>>
Java 8——接口中个的默认方法和静态方法
查看>>
Selenium操作页面元素
查看>>
Ubuntu 下安装VNC server
查看>>
Bzoj1034 [ZJOI2008]泡泡堂BNB
查看>>
Bzoj4011 [HNOI2015]落忆枫音
查看>>
Linux-环境变量的设置和查看
查看>>
android关于pull解析的问题-1
查看>>
ArcGIS JavaScript API本地部署离线开发环境
查看>>
【bzoj 4455】小星星(树型DP+容斥原理+dfs建树和计算的2种方式)
查看>>
词法分析程序 LEX和VC6整合使用的一个简单例子
查看>>
如何在WinForm中发送HTTP请求
查看>>
亚马逊EC2根硬盘空间扩容
查看>>
洛谷 P2167 [SDOI2009]Bill的挑战
查看>>