关于duplicate symbols for architec
在开发中我们可能与遇到duplicate symbols for architecture xxx
的编译问题,下面我们总结下都有哪些原因造成出现这个错误,以便再次遇到这种问题时能够快速地排查解决。duplicate意思是重复的,可复制
的,symbols是符号、标识的意思。所以这个问题一般是工程中存在某些相同的东西。我们一般可以从这个方向去进行排查,一般出现这种情况,在错误信息中都会给出提示,还是比较容易找出出现问题的地方并快速地解决的。网上一搜也会有很多说这问题的出现和解决方式,但自己也想总结记录下来。
引入了重复的文件
第一种就是可能你的工程或第三方库中存在了相同的东西。比如我新建了一个Person类,虽然后来不能再新建一个重复的类(Xcode会提示是否替换),但是可以通过在Finder中拉个相同的文件复制到工程目录中,或者引入的第三方库或自己实现的库中与工程有相同文件名的文件,在编译阶段就会报错。如有两个重复的文件:
2 duplicate symbols for architecture x86_64
而排查哪些重复的话,就看Xcode错误的上方就会有提示,比如:
duplicate symbol `_OBJC_CLASS_$_RDYPerson` in:
......
这样就可以看出重复的类(或importl了.m)为:RDYPerson了。移除其中一个或重命名即可。
import头文件写成了.m
如果在一个类中将#import写成了:
//#import "RDYPerson.h"
#import "RDYPerson.m"
也是会报duplicate symbols这样的错误。
声明了多个相同变量
声明了全局的多个同名变量,而且未使用extern
关键字,编译设置中还开启了No Common Blocks
,那么编译器就会检查,然后抛出这样的错误。将这个属性设置为NO,则可编译通过。
例如下面:
//extern NSString *testVar;使用extern表明它在其他文件中已声明,需要用到RDYDSIViewController中的这一变量
NSString *testVar;
//需要声明在外面
@implementation RDYPerson
@end
NSString *testVar;
@interface RDYDSIViewController ()
@end
存在两个全局的变量testVar,No Common Blocks
又开启了,所以编译就会报错错,关闭这个设置后或将其中一个加上extern
关键字即可解决。
C/C++中的extern关键字的作用是:extern可以
创建外部文件可以访问的全局变量
,这样就可以达到多个类同时操控同一变量的目的。