【问题标题】:iOS programming - Duplicate symbol _OBJC_IVARiOS 编程 - 重复符号 _OBJC_IVAR
【发布时间】:2011-03-29 21:22:36
【问题描述】:

运算符类:

#import <Foundation/Foundation.h>


@interface operator : NSObject {

int number;
}

@property int number;

@end

@implementation operator

- (id)init{
    self = [super init];
    if (self) {
    [self setNumber:0];
    }
    return self;
}

@synthesize number;
@end

main.m:

#import <UIKit/UIKit.h>
#import "operator.m"

int main(int argc, char *argv[]) {

id operator1 = [[operator alloc] init];
id operator2 = [[operator alloc] init];

[operator1 setNumber:10];
[operator2 setNumber:20];

int answer = [operator1 number] + [operator2 number];

printf("The answer is %d",answer);



NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}

我收到一个错误 -> ld: duplicate symbol _OBJC_IVAR_$_operator.number in /Volumes/Home/Desktop/testing/build/testing.build/Debug-iphonesimulator/testing.build/Objects-normal/i386/operator.o and /Volumes/Home/Desktop/testing/build/testing.build/Debug-iphonesimulator/testing.build/Objects-normal/i386/main.o

这是我第一次使用 ObjC 编程。我做错了吗?

我尝试了在谷歌上找到的“清理所有目标”修复,但没有帮助。

【问题讨论】:

标签: iphone objective-c ios4


【解决方案1】:
  1. 您永远不应该将#import 一个.m 文件放入另一个文件中。如果需要,您可以导入 .h 文件。
  2. 在创建自动释放池之前,您不应该在main 中执行代码。这迟早会引起问题。在这种情况下,您的测试代码可能应该转入application:didFininshLaunching。

【讨论】:

  • @alexBrand:您将@interface 和@implementation for 运算符组合在同一个文件中,然后导入整个内容。不要那样做。把它们放在operator.h和operator.m中,然后#import only operator.h到main.m中。
  • 我导入了 operator.h 文件,它可以工作:)。非常感谢。我还将自动释放池移动到代码的开头。现在,我该如何使用应用程序:didFinishLaunching?
  • 你救了我,我误点击并添加了 .m 并想知道为什么它不起作用:)
  • 救命!谢谢。
  • 该死的自动完成!
【解决方案2】:

涉及静态库

我添加了一个与我也使用的静态库中的类同名的类。所以在我的班级名称中添加前缀解决了这个问题。

【讨论】:

  • 也为我工作!
  • 我在源代码中有相同的 filename.m。两者都不是重复的,而只是相同的文件名。我换了一个,按照 DanSkeel 的建议工作。
【解决方案3】:

从可以在任何文件中导入的 .m 文件中搜索。有时很难找到它

【讨论】:

  • 在这样的每个问题上重复太多相同的答案。它不再有帮助了
  • 对不起,它没有帮助你..当我发现这个问题时,这是我的问题,然后我分享了解决方案..当然不再有帮助了..从 2011 年开始......
【解决方案4】:

对于没有上述解决方案的其他用户,这是我的问题所在。我是一个懒惰的程序员,所以我不会为新页面(UIView)重写所有代码,而是经常复制并粘贴以前的 UIView 的 .m 和 .h 文件......这样做有时我会忘记更改我复制的 .m 和 .h 文件中的接口(即使我更改了文件名)......这也会导致同样的问题。祝大家好运,这也发生了!

【讨论】:

    【解决方案5】:

    就我而言,我在 Build Phases --> Compile Sources 中的 .m 文件中发现了双重声明。 删除副本为我解决了这个问题。 希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 2020-07-07
      • 2015-11-02
      • 2020-03-13
      • 1970-01-01
      相关资源
      最近更新 更多