【问题标题】:xcode 4.6.1 and LLVM 4.2: ld: 2 duplicate symbols for architecture armv7xcode 4.6.1 和 LLVM 4.2:ld:架构 armv7 的 2 个重复符号
【发布时间】:2013-04-14 22:58:44
【问题描述】:

本周我第一次尝试构建公司 iOS 库/框架,按照this blog post here 中的步骤进行操作。

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

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

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 的接口声明等。 p>

但是,当我导入它时,我收到以下重复错误。 除了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:我已按照博客上的说明进行操作。但是我无法链接模拟器(出现错误的架构错误),所以我猜测框架中可能有问题而不是项目本身。这可能是重复错误的原因吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    iContactsGridCell *myObj; iContactsGridCell *myObj;

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

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

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

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

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

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

    【讨论】:

    • 感谢您花时间回答。不幸的是,我已经采取了您建议的所有预防措施。有趣的是,另一个也继承自 Cell 的类不会产生相同的错误。我认为该项目已经以某种方式搞砸了,损坏了,等等。
    • 好吧,你把我带到了正确的地方。我觉得这样说很傻,但是框架和项目中都是同一个类。一旦我删除它,问题就解决了。 Kudos+++ 如果你想对框架类的重新声明进行编辑,我会给你答案:)
    • @Alex 刚刚做了,很高兴你知道了 :)
    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2015-06-15
    • 2013-05-01
    • 2012-11-23
    相关资源
    最近更新 更多