我不知道为什么,但经过一段时间工作没有问题我添加了一些按钮,然后我启动了我的应用程序,出现了这个错误:
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查看调用)
答案 0 :(得分:1)
每当我有重复的符号错误时,几乎总是因为我的标题中有一个循环#import。解决方案非常简单,尽可能使用前向声明,而使用来自.m文件的#import .h文件。
只有两种情况需要#import一个.h来自另一个:
具体来说,不需要导入文件只是为了在签名中使用类名或协议;而是使用前向声明。
例如,这个(在Bar.h中):
#import "Foo.h"
可能会成为这个(Bar.h):
@class Foo;
@protocol FooDelegate;
和bar.m:
#import "Foo.h"
答案 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;
}