我在windows上使用gnustep来实现objective-c。如果我将类的接口和实现文件与主文件放在一起,它编译时不会出错,并给出预期的输出。
示例如下:
// 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
我如何保持文件分开,仍然成功地编译程序
Thanks for help
对
这里有一个链接错误。最有可能的是,您没有为myNewClass包含必需的头文件。
我知道这是旧的,但是要仔细检查编译文件的名称,以防错误在不同的文件中。
原因:上面的代码中没有引用类myNewClass,并且除了Foundation之外没有其他导入。
代码注释中的文件名和你正在编译的文件名不一样。
// File "test.m"
gcc `gnustep-config --objc-flags` -o program program.m
从它的外观来看,给定的代码在拆分时应该可以编译。
另外,关于问题"我还如何包括"编译文件"?",假设你的意思是一个。o文件,你只需要包括头文件(.h),并确保编译器可以找到匹配的。o文件。相关:如何在C中链接对象文件?