我在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
如何将文件分开并仍然成功编译程序
感谢您的帮助
此致
答案 0 :(得分:0)
这里有一个链接器错误。最有可能的是,您没有为myNewClass包含必需的头文件。
答案 1 :(得分:0)
我知道这是旧版本,但请仔细检查已编译文件的名称,以防错误位于其他文件中。
原因: 上面的代码中没有引用类 myNewClass ,除了Foundation之外没有其他导入。
代码注释中的文件名和您要编译的文件不同。
// 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"