如何用GCC编译Objective-C代码?

时间:2013-01-18 23:05:28

标签: objective-c gcc

当我尝试编译此代码时,我使用gcc:

形式here
#import <stdio.h>
#import <objc/Object.h>

@interface Hello: Object
- (void) init;
- (void) say;
@end

@implementation Hello
- (void) init {
  [super init];
}
- (void) say {
  printf("Hello, world!\n");
}
@end

int main() {
  Hello *hello = [Hello new];
  [hello say];
  [hello free];
  return 0;
}
带有命令行的

:g ++ -x objective-c ++ test.mm -otest -lobjc

编译时,我收到以下警告:

test.mm:11:14: warning: ‘Object’ may not respond to ‘-init’ [enabled by default]
test.mm:11:14: warning: (Messages without a matching method signature
[enabled by default]
test.mm:11:14: warning: will be assumed to return ‘id’ and accept
[enabled by default]
test.mm:11:14: warning: ‘...’ as arguments.) [enabled by default]
test.mm: In function ‘int main()’:
test.mm:19:28: warning: ‘Hello’ may not respond to ‘+new’ [enabled by default]
test.mm:21:14: warning: ‘Hello’ may not respond to ‘-free’ [enabled by default]

如果我试图跑 - 我得到SIGSEGV:

$> ./test
$> Segmentation fault

我做错了什么?

env:linux-x86_64,gcc-4.7.2

感谢。

1 个答案:

答案 0 :(得分:3)

那段代码错了。而古老的。它永远不会奏效。现在它将(修复并添加一些其他示例)。

首先,检查您是否安装了GNUStep。如果这样做,请切换到使用NSObject和libFoundation(实际上libgnustep-base,正如Fred在评论中指出的那样)。

其次,[IIRC - 在这里抓旧脑细胞]当对象仍然是根类时init仍然返回(id)。由于您在init方法中没有做任何有用的事情,只需将其完全删除即可。

编译器错误表明您的Hello子类未正确继承Object,这没有任何意义。