2011-07-15 42 views
0

我在windows上使用gnustep作爲objective-c。如果我將一個類的接口和實現文件與主文件一起保存,它將無錯地編譯並給出預期的輸出。objective c gnustep - 無法分離接口和實現文件

以下是例子:

// File "classA.h" 
#import <Foundation/Foundation.h> 

@interface classA: NSObject 
{ 
    int a; 
} 

-(void) print; 
@end 


// File "classA.m" 
#import "classA.h" 

@implementation classA 

-(void) print 
{ 
    a = 10; 
    NSLog(@"a = %i", a); 
} 
@end 


// File "test.m" 
#import "classA.h" 

int main(int argc, char *argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSLog(@"start"); 

    classA *objA = [[classA alloc] init]; 
    [objA print]; 
    [objA release]; 

    NSLog(@"done"); 

    [pool drain]; 
    return 0; 
} 

但是,如果我單獨把接口和實現文件,使用下面的命令編譯

gcc `gnustep-config --objc-flags` -o program program.m -L /GNUstep/System/Library/Libraries -lobjc -lgnustep-base 

我獲得以下錯誤

undefined reference to `__objc_class_name_myNewClass' 
collect2: ld returned 1 exit status 

我如何保持文件分開並仍然編譯程序

感謝您的幫助

問候

+1

您應該嘗試使用GNUstep-Make的Makefiles,它比手動調用編譯器更全面。看看這個教程:http://www.gnustep.it/nicola/Tutorials/WritingMakefiles/index.html – MKroehnert

回答

0

您在這裏有一個鏈接錯誤。很可能,您沒有爲myNewClass包含必需的頭文件。

+0

我做過。我包括使用#import「myNewClass.h」。我的myNewClass.h和myNewClass.m文件與myTest.m文件位於同一文件夾中 – user427969

+0

myNewclass.m是編譯文件的一部分嗎?您可能會錯過鏈接到myNewClass.o(無法讀取您的命令行,它被包裝)。 –

+0

我不確定。我使用#import「myNewClass.h」將myNewClass.h包含在myNewClass.m和myTest.m中。另外我如何包括「編譯文件」?問候 – user427969

0

我知道這是舊的,但仔細檢查編譯文件的名稱,以防萬一錯誤在不同的文件中。

原因: 類myNewClass沒有在上面的代碼中引用,並沒有其他等進口比基金會。

代碼註釋中文件的名稱和您看起來要編譯的文件不同。

// File "test.m" 

gcc `gnustep-config --objc-flags` -o program program.m 

從外觀上看,給定的代碼應該在拆分時編譯。

另外,關於「我怎樣包括」編譯文件「?」,假設你的意思是一個.o文件,你只需要包含頭文件(.h)並確保編譯器能夠找到匹配.o文件。相關:How do I link object files in C? Fails with "Undefined symbols for architecture x86_64"