0

我第一次尝试构建公司 iOS 库/框架是在本周,按照此处博客文章中的步骤进行操作。

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

但是,现在我遇到了一个非常奇怪的错误:

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

有问题的行表明:

重复符号 _OBJC_CLASS_$_iContactsGridCell 在:/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 在:/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. 我怎样才能获得更多信息,更详细地输出​​重复项的位置

PS:我已经按照在博客上找到的说明来信了。但是我无法链接模拟器(出现错误的架构错误),所以我猜测框架中可能有问题而不是项目本身。这可能是重复错误的原因吗?

4

1 回答 1

8

有几个地方可能会出现此错误。我会执行以下操作来开始搜索问题:

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

iContactsGridCell *myObj; iContactsGridCell *myObj;

  1. 确保你没有做这样的事情:#import "iContactsGridCell .m "

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

  3. 确保您没有重新声明一个类(包括 Apple 在其框架中提供的类)

要点:这就是我能想到的。但要记住的是,在您的项目中的某个地方存在两个对象、类声明等。它们是相同的。编译器因此而抱怨。

为什么编译器会抱怨(更多信息):虽然这些信息确实“不必要”,但作为程序员了解幕后发生的事情并通常有助于调试是一种很好的做法,所以这里有一些关于编译器的信息:

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

于 2013-04-14T23:23:25.110 回答