2013-08-03 129 views
1

Objective-C的代碼,所以我有這樣的一段代碼...無法編譯在Ubuntu

/** 
* 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目標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 ... ...它編譯,但我仍然得到一個分段錯誤...

+0

什麼是您使用的libobjc?我相信GNUStep的根類是'NSObject',而不是'Object'。 –

+0

我正在使用GNU Objective C庫。這是gobjc 4.7 ...以前的版本有新的方法,但他們在4.7中棄用它,我不知道如何現在實例化方法... –

+0

你可以使用'alloc' /'init'就像它在評論中說的那樣。 –

回答

2

+(ID)新的NSObject類的功能。但是,您正在創建一個運行時對象的子類。要使用您在OS X中習慣使用的大多數Apple方法,您需要改爲NSObject的子類。

此外,在界面中,不執行申報對象的超類。您需要更改@implementation CDB : NSObject@implementation CDB,然後在您的頭文件中,位置@interface CDB : NSObject { ...

+0

這將工作,如果我在OS X上,但我在Ubuntu Linux上,我不使用Apple的Objective-C運行時...我使用GNU Objective-C運行庫(gobjc 4.7) –

+2

哦,我完全意識到那。您仍然可以在使用GNU運行時的同時使用Foundation框架。它應該可用。有一個參考可以在這裏使用:http://blog.lyxite.com/2008/01/compile-objective-c-programs-using-gcc.html – eswick

3

我認爲一些古老的運行時已經實現了+新的和朋友。對於像gnustep-runtime這樣更新的運行時(包括一個與GCC有很大不同的GCC),我認爲,你必須使用類別或其他來實現你自己的胡扯。你可以切斷&粘貼GNUstep的NSObject實現,但對於你來說可能太棘手,因爲它不會像使用retain counter等前綴malloc一樣,否則你可能想要實現自己的方式來維護參考計數,比如使用哈希映射或任何東西。如果GNUstep-base本身對你有太多胡扯,你也可以嘗試像ObjFW這樣的替代框架。

相關問題