xcode 4.6.1和LLVM 4.2:ld:2个体系结构armv7的重复符号

时间:2013-04-14 22:58:44

标签: objective-c xcode frameworks linker linker-errors

我本周首次尝试建立公司iOS库/框架,遵循this blog post here中的步骤。

出于这个问题之外的原因,我只能在构建设备而不是模拟器时进行链接。

然而,现在我收到一个非常奇怪的错误:

  

ld:架构armv7 clang的2个重复符号:错误:链接器   命令失败,退出代码为1(使用-v查看调用)

有问题的行提示:

  

重复符号_OBJC_CLASS _ $ _ iContactsGridCell in:       /Users/*/Desktop/Projects/contactservice/branch/ContactServicesClient/DerivedData/iContacts/Build/Intermediates/iContacts.build/Debug-iphoneos/iContacts-5.1.build/Objects-normal/armv7/ iContactsGridCell.o       /Applications/Xcode.app/Contents/Developer/Library/Frameworks/athium-iOS.framework/athium-iOS   重复符号_OBJC_METACLASS _ $ _ iContactsGridCell in:       /Users/*/Desktop/Projects/contactservice/branch/ContactServicesClient/DerivedData/iContacts/Build/Intermediates/iContacts.build/Debug-iphoneos/iContacts-5.1.build/Objects-normal/armv7/ iContactsGridCell.o       /Applications/Xcode.app/Contents/Developer/Library/Frameworks/athium-iOS.framework/athium-iOS

显然,有问题的类是iContactsGridCell.h

该类本身继承自Cell.h

@interface iContactsGridCell : Cell

类Cell.h是框架的一部分,如果我没有导入正确的文件,那么正如预期的那样我得到一个语义错误:找不到Cell 等的接口声明等。

但是,当我导入它时,我收到以下重复错误。 除了 iContactsGridCell.h 之外,该文件不包含在项目的任何其他位置!

文件 Cell.h 反过来,只是在框架下找到的一个类:

@interface Cell : NSObject

@property (strong,nonatomic) UIView *view;
@property CGRect rect;
@property int UID;
@property BOOL highlighted;
@property UIColor *b_colr;

- (id) initWithRect:(CGRect)frame;
- (BOOL) hasCoordinates:(CGPoint)coord;
- (void) ripple;
- (void) cubefy;
- (void) flipfy;
- (void) rotate;
- (void) setBg:(UIColor *)bg withAlpha:(CGFloat)alpha;
- (void) highlight;
- (void) unhighlight;
- (void) updateWithRect:(CGRect)rect;

@end
  1. 为什么我得到重复的错误?
  2. 可能导致这种情况的原因是什么?
  3. 怎么能修好?
  4. 如何获得更多信息更详细的 重复项的输出?
  5. PS:我已经按照博客上发现的信息进行了跟踪。然而,我无法链接模拟器(得到错误的架构错误)所以我的猜测可能是框架中的某些东西被打破而不是项目本身。这可能是重复错误的原因吗?

1 个答案:

答案 0 :(得分:8)

有几个地方可能会出现此错误。我会按照以下步骤开始搜索问题:

  1. 使用finder搜索项目文件夹,查看文件“iContactsGridCell.h”是否存在。或者,如果某处存在任何两个文件。
  2. 确保您没有两个具有相同名称的类iContactsGridCell的对象,例如:
  3. iContactsGridCell * myObj; iContactsGridCell * myObj;

    1. 确保你没有这样做:#import “iContactsGridCell .m

    2. 或者像这样:#import“iContactsGridCell.h”#import“iContactsGridCell.h”

    3. 确保您不会重新声明课程(包括Apple在其框架中提供的课程)
    4. 要点:这就是我能想到的全部。但要记住的是,项目中的某个地方存在两个对象,类声明等。这是相同的。而编译器因此而抱怨。

      为什么编译器会抱怨(更多信息):虽然这些信息实际上是“不必要的”但是作为程序员来理解底层发生的事情并且通常会帮助调试是很好的做法,所以这里是关于编译器的一些信息:

      请记住,编译器(虽然更复杂)是一个程序,就像您使用它创建的程序一样。大多数(如果不是全部)编译器的一个步骤是在某一点或另一个读取代码中为每个变量,类,结构创建“符号或键”。因此,在某些时候,编译器达到了一行代码“在其他地方重复/重复”。因此,编译器完成例程的“键/符号”创建过程失败。