2

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

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

4

2 回答 2

1

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

int _x = 1;
int _x = 2;

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

你得到的错误基本上是一样的。你在_x某处声明,从编译器的角度来看,你做了两次。有几种方法可以解决这个问题,具体取决于所_x代表的内容。

chrahey 的回答解释了前向类声明。我不会在这里再次讨论这个问题,只是说前向声明可以帮助您解决循环引用,其中 A 类的定义取决于 B 类,反之亦然。

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

富.h:

extern int _x;

Foo.m

int _x;

功能几乎相同。看起来那_x不是一个函数,但如果是,并且如果你愚蠢地将函数定义放在头文件中,那么如果该文件被导入多个实现文件,你会再次收到错误. 这就是为什么头文件包含原型而不是定义的原因:

富.h:

int foo(int a);

Foo.m

int foo(int a)
{
    return a + 10;
}
于 2012-07-17T18:10:56.160 回答
1

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

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

  1. 如果您在#import 中扩展类
  2. 您正在#import中实现协议

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

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

#import "Foo.h"

可能会变成这样(Bar.h):

@class Foo;
@protocol FooDelegate;

和 bar.m:

#import "Foo.h"

这是指向前向声明文档的链接。

于 2012-07-17T17:14:39.500 回答