无法在Ubuntu上编译Objective-C代码

时间:2013-08-03 23:51:42

标签: objective-c ubuntu clang gnu gnustep

所以我有这段代码......

/**
 * cdb.m
 * Copyright (C) 2013 Naveen Mathew. All rights reserved.
 */

#import <objc/Object.h>
#import "cdb.h"
#import <stdio.h>
#import <stdlib.h>

@implementation CDB : Object
{

}

- (int) main {
    printf("Hello world");
    return 0;
}

@end

int main(void)
{
    CDB *myNumber = [CDB new]; // equal to [[Number alloc] init]
    [myNumber main];

    return 0;
}

我想在Ubuntu 13.04中编译它,但没有GNUStep给我的所有废话。所以我使用GNU Objective C运行时(gobjc),但是当我编译时,我得到以下内容......

clang -Wall -lobjc -o cdb cdb.m -I/usr/lib/gcc/x86_64-linux-gnu/4.7/include
cdb.m:25:21: warning: class method '+new' not found (return type defaults to
      'id') [-Wobjc-method-access]
        CDB *myNumber = [CDB new]; // equal to [[Number alloc] init]
                        ^    ~~~
1 warning generated.

当我运行该程序时,我得到一个分段错误...我正在使用gobjc 4.7。我尝试使用gobjc 4.6 ...它编译但我仍然遇到分段错误......

2 个答案:

答案 0 :(得分:3)

我认为一些古老的运行时已经实现了+ new和friends。对于像gnustep-runtime这样的新运行时,包括一个与GCC非常不同的运行时,我认为,你必须使用类别或任何方式实现自己的掷骰子。你可以切断&amp;粘贴GNUstep的NSObject实现,但它可能对你来说太棘手,因为它会像使用retain counter等为malloc添加前缀,否则你可能想要实现自己的方式来维护引用计数,就像使用哈希映射或任何东西一样。你也可以尝试使用像ObjFW这样的替代框架,如果GNUstep-base本身就有太多的骰子。

答案 1 :(得分:2)

+(id)new是NSObject类的一个函数。但是,您是运行时对象的子类。要使用您习惯在OS X中使用的大多数Apple方法,您需要替代NSObject。

此外,您在接口中声明了对象的超类,而不是实现。您需要将@implementation CDB : NSObject更改为@implementation CDB,然后在您的标题文件中添加@interface CDB : NSObject { ...