2011-07-15 43 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"