【问题标题】:objective c gnustep - cannot separate interface and implementation files目标c gnustep - 无法分离接口和实现文件
【发布时间】:2011-07-15 07:13:57
【问题描述】:

我在 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

如何将文件分开并仍然成功编译程序

感谢您的帮助

问候

【问题讨论】:

标签: objective-c gnustep


【解决方案1】:

这里有一个链接器错误。很可能,您没有包含 myNewClass 所需的头文件。

【讨论】:

  • 我做到了。我包括使用#import“myNewClass.h”。我在与 myTest.m 文件相同的文件夹中有 myNewClass.h 和 myNewClass.m 文件
  • myNewclass.m 是编译文件的一部分吗?您可能会错过链接到 myNewClass.o(无法读取您的命令行,它已被包装)。
  • 我不确定。我使用#import "myNewClass.h" 将 myNewClass.h 包含在 myNewClass.m 和 myTest.m 中。另外我如何包含“编译文件”?问候
【解决方案2】:

我知道这是旧的,但请仔细检查编译文件的名称,以防错误出现在不同的文件中。

原因: myNewClass 类在上面的代码中没有被引用,并且除了 Foundation 之外没有其他导入。

代码 cmets 中的文件名称与您似乎正在编译的文件不同。

// 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多