我正在编译我的程序,但在链接阶段,我收到错误:
ld: 1 duplicate symbol for architecture x86_64
我有两个不同的类,每个类在@implementation
内的.m文件中包含一个变量(当然我知道哪一个)。
如果我更改其中一个的名称,它就可以了。
在this link我看到.m中声明的内容是“私有的”,所以我不明白这个错误来自何处以及如何修复它。
注意 - 让我的问题更清晰:
假设我有一个班级EiffelTower
和另一个班级NiceGreenMonkey
,他们都是NSObject
的子类,他们都有一个变量mAge
(在现实生活中它是{{1} }})。
我应该在哪里以及如何声明该变量((NSMutableDictionary *) someData
)以便我不会收到错误?
答案 0 :(得分:0)
由于您没有包含任何代码,这只是一个猜测:如果您在(Objective-)C文件中声明一个全局变量,那么编译后的二进制文件将该全局变量作为公共符号。如果对不同文件中的全局变量使用相同的名称,然后尝试将已编译的二进制文件组合到同一个应用程序中,则会从链接/加载器(错误中的ld
)中获得重复的符号错误。
(请注意,这与语言级别的两个变量的可见性无关,在编译文件时不采取措施使变量可见,编译器不允许您在另一个文件中引用变量文件,因为它只是不会看到它。)
要防止使用与其关联的公共符号定义的全局范围定义的变量,可以将修饰符static
添加到其声明中。这会将变量的可见性限制在该语言和已编译的二进制级别的文件中。
对评论的回应
您的变量是不实例变量,如果它们存在错误,您将无法获得错误。所以我猜错了,你错误地声明了你的实例变量。这就是为什么在提问时应始终包含代码的原因。我能做的就是再次猜测。这是实例变量声明应该是什么样的:
@implementation SomeClass
{ // open brace indicates start of instance declarations
int birdCount; // an instance variable
// ...
} // close brace, end of instance variables
// methods...
@end
你错过了牙箍吗?如果你有,那么你已经声明了全局变量而不是实例变量。
如果这个猜测仍然存在错误编辑您的问题并添加您的代码!您很幸运SO社区尚未关闭您的问题,您需要帮助人们为您提供帮助。
HTH