2013-01-18 60 views
3

当我尝试编译这段代码,我得到了形式here用gcc:如何用GCC编译Objective-C代码?

#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; 
} 

与COMAND行: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

谢谢。

+0

它应该是'-x objective-c'而不是'-x objective-C++'吗? – KevinDTimm

+0

@KevinDTimm,同样的错误。 – niXman

回答

3

该代码错误。古老。它永远不会工作。现在它会有(固定并添加一些额外的例子)。

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

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

编译器错误指示您的Hello子类不正确地继承Object,这是没有意义的。

+0

@bumm,维基百科再说谎。谢谢。 – niXman

+0

@niXman它不是在说谎,它只是不适合剪贴。请允许我修改niXman的bbum评论,在GNUstep中它是libgnustep-base,libFoundation实际上是作为一个不同的项目存在的,并且在某些时候或者可能曾经与libgnustep-base互换过。 –

+0

感谢您的纠正 - 自从我在Linux上编译ObjC以来已经有十多年了。事实上,维基百科的文章一直在说谎,直到我修好。代码不起作用,neve会有。 – bbum