我正在使用GNUstep在Windows上学习Objective-C。我有一个看起来像这样的主类:
#import <Foundation/Foundation.h>
#import "Photo.h"
int main(int argc, const char * argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id *photo = [[Photo alloc] init];
[photo setCaption:@"Hello, world!"];
[pool drain];
return 0;
}
然而,当我尝试编译时,它抱怨对Photo的未定义引用。如果我将Photo.h更改为Photo.m它可以工作(大概是因为在Photo.m的顶部有Photo.h的导入)。
然而,这似乎不是惯例。如何让链接器查看Photo.h文件?
答案 0 :(得分:4)
您需要编译Photo.m以及此主文件(例如cc -framework Foundation Photo.m main.m
)。仅仅导入标题不足以使GCC编译Photo.m。
顺便说一句,导入实现文件不仅非常规,在大多数情况下都不会编译(具体来说,如果多次包含定义全局符号的文件,您将获得重复的符号。)
答案 1 :(得分:1)
未定义的引用与缺少的标头无关,而是告诉您有未声明的标头。
现在这意味着您的Photo.m类没有被编译,请检查您的项目设置并验证文件是否正在编译并链接到您的可执行文件,错误应该消失。
旁注:包含.m
文件没有意义,因为它们包含实现细节(您不感兴趣)而不是标题(您应该感兴趣)。
答案 2 :(得分:0)
您还应该检查您的Photo.m是否已启用所需目标。 否则,它不会被编译,链接器也无法找到它。