运行我的应用程序后,我一直有这个问题

时间:2012-07-17 17:09:55

标签: objective-c ios

我不知道为什么,但经过一段时间工作没有问题我添加了一些按钮,然后我启动了我的应用程序,出现了这个错误:

  

ld:重复符号_x in   /Users/alexbarco/Library/Developer/Xcode/DerivedData/RecolectaDatos-ayjpqqcajbhuzvbkvernzsyunpbe/Build/Intermediates/RecolectaDatos.build/Debug-iphonesimulator/RecolectaDatos.build/Objects-normal/i386/SeconViewController.o   和   /Users/alexbarco/Library/Developer/Xcode/DerivedData/RecolectaDatos-ayjpqqcajbhuzvbkvernzsyunpbe/Build/Intermediates/RecolectaDatos.build/Debug-iphonesimulator/RecolectaDatos.build/Objects-normal/i386/ViewController.o   对于体系结构i386 clang:错误:链接器命令失败并退出   代码1(使用-v查看调用)

2 个答案:

答案 0 :(得分:1)

每当我有重复的符号错误时,几乎总是因为我的标题中有一个循环#import。解决方案非常简单,尽可能使用前向声明,而使用来自.m文件的#import .h文件。

只有两种情况需要#import一个.h来自另一个:

  1. 如果您要在#import
  2. 中扩展课程
  3. 在#import
  4. 中实施协议

    具体来说,需要导入文件只是为了在签名中使用类名或协议;而是使用前向声明。

    例如,这个(在Bar.h中):

    #import "Foo.h"
    

    可能会成为这个(Bar.h):

    @class Foo;
    @protocol FooDelegate;
    

    和bar.m:

    #import "Foo.h"
    

    以下是the documentation on forward declarations的链接。

答案 1 :(得分:1)

“重复符号”消息表示您在同一范围内声明了一些名称(在本例中为_x)两次。假设你有这样的代码:

int _x = 1;
int _x = 2;

你希望得到一个错误,对吗?您可以同时对两件事使用相同的名称。

您获得的错误基本相同。你在某个地方声明_x,从编译器的角度来看,你正在做两次。有几种方法可以解决这个问题,具体取决于_x代表的内容。

chrahey的回答解释了关于前向类声明。我不会在这里再说一遍,除了说前向声明可以帮助你解决循环引用,其中A类的定义取决于B类,反之亦然。

如果_x是变量,则可能是您尝试在头文件中声明它。编译器基本上将您导入的每个头文件的内容复制到源文件中,因此如果您在头文件中声明一个变量,然后将该头导入两个或多个实现文件,那么最终会有多个声明。变量。要解决这个问题,请使用extern关键字告诉编译器“此名称将在其他地方声明”,然后将实际声明放在实现文件中:

foo.h中:

extern int _x;

Foo.m

int _x;

功能几乎完全相同。似乎_x不是一个函数,但如果它是,如果你愚蠢到将函数定义放在头文件中,那么如果该文件被导入到那么你又会出错多个实现文件。这就是头文件包含原型而不是定义的原因:

foo.h中:

int foo(int a);

Foo.m

int foo(int a)
{
    return a + 10;
}