【问题标题】:Newbie Objective C Error such as _main新手Objective C错误,例如_main
【发布时间】:2015-08-12 20:17:54
【问题描述】:

我整天都在修修补补,我似乎无法修复这个错误。

代码如下:

//
//  main.m
//  Learning ObjC
//
//  Created by Nickirv on 8/9/15.
//  Copyright (c) 2015 Nickirv. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person: NSObject{
    int age;
    int weight;
}
-(void) print;
-(void) setAge: (int) a;
-(void) SetWeight: (int) w;
@end

它会输出这个问题:

 "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果有任何帮助,我将不胜感激!非常感谢你!

【问题讨论】:

  • 前导下划线 _ 由编译器添加到函数名称之前,因此您看到的 main 在编译器和错误消息中变为 _main

标签: objective-c xcode xcode6


【解决方案1】:

您不能删除main 样板代码:

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

    }
    return 0;
}

最后,Objective-C 是“C”,程序通过调用main 开始执行。此外,Objective-C 代码需要在 autoreleasepool 中执行。

您在样板之外(通常在上面)定义类 @interfaces@implemtations,但要运行的第一行代码必须在自动释放池范围内 {}

这是一个示例 Objective-C 程序,类似于 OP 似乎想要的,为了简单和演示,使用 @properties

在完全理解以下代码之前,学习 Objective-C 文档很重要,td;dr 不适用于此。

#import <Foundation/Foundation.h>

@interface Person: NSObject
@property int age;
@property int weight;
- (void)print;
@end

@implementation Person : NSObject
- (void)print {
    printf("Age: %i, weight: %i", self.age, self.weight);
}
@end


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

        Person *don = [[Person alloc] init];
        don.weight = 130;
        don.age = 23;
        [don print];

    }
    return 0;
}

输出:

年龄:23​​,体重:130

【讨论】:

  • 感谢您的帮助!主要样板代码是否高于我的@implementation 和@interfaces 是否重要?
  • 是的,因为main 函数必须知道它调用了什么。一般来说,在 Objective-C 类中,当前编译器中不需要事先声明(方法顺序)。区别是编译器中的一种怪癖。一般来说,Objective-C 代码在一个单独的文件中,所以这个排序问题不是问题。
  • 非常感谢您的真诚帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
相关资源
最近更新 更多