【问题标题】:"Duplicate symbols" linker error for no apparent reason没有明显原因的“重复符号”链接器错误
【发布时间】:2013-01-14 19:31:10
【问题描述】:

我在链接我的项目时看到Duplicate symbols。我不知道这意味着什么,也不知道如何解决它,所以任何帮助将不胜感激。

因为 shipNameText 似乎是错误的来源,所以我在这里使用它: 在 .h 中:

@property (strong,nonatomic)IBOutlet  UILabel *shipNameText;

在.m

@interface boatInfoViewController ()

@end

@implementation boatInfoViewController
@synthesize shipNameText, shipSizeText;


- (void)viewDidLoad
{
    [super viewDidLoad];
    NSUserDefaults *shipName = [NSUserDefaults standardUserDefaults];
    NSUserDefaults *shipSize = [NSUserDefaults standardUserDefaults];
    NSString *name = [[NSUserDefaults standardUserDefaults]
                                 objectForKey:@"shipName"];
    NSString *size = [[NSUserDefaults standardUserDefaults]
                      objectForKey:@"shipSize"];
    shipNameText.text = name;
    shipSizeText.text = size;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

【问题讨论】:

  • 我已尝试清理构建文件夹
  • 检查您是否在某处 #import 了一个 .m 文件而不是 .h 文件。 - 也许#import "boatInfoViewController.m"
  • 把我带到了那里!该死的xcode自动完成:p
  • 好的。您想要一个可以接受的正式答案吗?
  • 是的,当然。代表我们俩

标签: ios objective-c xcode compiler-errors


【解决方案1】:

如果您导入实现文件“boatInfoViewController.m”而不是接口文件“boatInfoViewController.h”,则会发生这种情况,因为“boatInfoViewController.m”随后会编译两次。

【讨论】:

  • 注意类要大写; BoatInfoViewController.
  • 这有什么区别,还是只是为了好看? @bbum
  • 那是为了编码约定。类名应以大写字母开头。检查这个Coding guidelines
  • ACB 所说的;编码约定。如果您遵循它们,您的代码将更像示例代码、框架 API,其他开发人员将能够更轻松地了解您的代码。
【解决方案2】:

你有一个 ivar 声明了两次。它的名字是shipNameText,并在boatInfoViewController 和其他地方声明。您是否通过简单地声明 @implementation@end 之间的某个位置来使用“本地”ivars?

【讨论】:

  • 添加了代码来询问我在哪里使用它们。看出什么问题了吗?
  • 不,您的代码没有问题,现在代码是可见的。正如马丁所说,您在某处包含 .m 文件而不是 .h 文件。但是,当您在实现中定义本地 ivars 并在两个或多个类中使用相同的名称时,您会从链接器收到非常相似的错误消息。
  • @HermannKlecker 我得到了类似的链接器错误,因为我在@interface 之外声明了我的变量并且在我的.h 文件中声明了@end。我通过将它放在@interface 和@end 之间来解决它。为什么会这样?我不明白..
  • @Cherry_thia,在Objective-C下面有C。如果你用@interface@implementation@end声明它,那么Objective C会处理它们。变量然后被认为是一个类对象/类的 cariable 或实例变量。 @-directives 之外的所有内容都是普通的 C。在 C 计划中,在功能块(或任何块)之外声明的变量在每个定义中都是全局的。在 C 中,如果所有其他单独编译并链接在一起的模块使用相同的变量名和 #external 指令,则可以正常工作。在 Obj-C 中,我们通常不会那样做。
猜你喜欢
  • 1970-01-01
  • 2012-04-10
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2011-02-26
  • 2014-01-16
相关资源
最近更新 更多