【问题标题】:Unable to compile Objective-C code on Ubuntu无法在 Ubuntu 上编译 Objective-C 代码
【发布时间】:2013-08-03 23:51:41
【问题描述】:

所以我有这段代码...

/**
 * cdb.m
 * Copyright (C) 2013 Naveen Mathew. All rights reserved.
 */

#import <objc/Object.h>
#import "cdb.h"
#import <stdio.h>
#import <stdlib.h>

@implementation CDB : Object
{

}

- (int) main {
    printf("Hello world");
    return 0;
}

@end

int main(void)
{
    CDB *myNumber = [CDB new]; // equal to [[Number alloc] init]
    [myNumber main];

    return 0;
}

我想在 Ubuntu 13.04 中编译它,但没有 GNUStep 给我的所有废话。所以我使用了 GNU Objective C 运行时(gobjc),但是当我编译时,我得到以下...

clang -Wall -lobjc -o cdb cdb.m -I/usr/lib/gcc/x86_64-linux-gnu/4.7/include
cdb.m:25:21: warning: class method '+new' not found (return type defaults to
      'id') [-Wobjc-method-access]
        CDB *myNumber = [CDB new]; // equal to [[Number alloc] init]
                        ^    ~~~
1 warning generated.

当我运行程序时出现分段错误...我使用的是 gobjc 4.7。我用 gobjc 4.6 尝试过...它可以编译但我仍然遇到分段错误...

【问题讨论】:

  • 你使用的 libobjc 是什么?我相信 GNUStep 的根类是 NSObject,而不是 Object
  • 我正在使用 GNU Objective C 库。它是 gobjc 4.7...以前的版本有新方法,但他们在 4.7 中弃用了它,我现在不知道如何实例化方法...
  • 您可以像评论中所说的那样使用alloc/init
  • 试过allocinitnew但是当我编译它说class method not found并且当我尝试运行程序时,我得到一个分段错误......
  • 我注意到您使用 clang 作为编译器,但使用 gcc 的头文件和库。这可能是个问题(虽然我希望有更多知识的人可以肯定地说)。

标签: objective-c ubuntu clang gnu gnustep


【解决方案1】:

我认为一些古老的运行时已经实现了 +new 和 friends。对于像 gnustep-runtime 这样的较新的运行时,包括一个非常不同的 GCC,我认为,您必须使用类别或其他方式实现自己的胡扯。您可以只剪切 & 粘贴 GNUstep 的 NSObject 实现,但这对您来说可能太棘手了,因为它会在 malloc 前面加上 retain counter 等,否则您可能希望实现自己的方式来维护引用计数,例如使用哈希映射或任何事物。如果 GNUstep-base 本身对你来说太麻烦的话,你也可以试试 ObjFW 之类的替代框架。

【讨论】:

    【解决方案2】:

    +(id)new 是 NSObject 类的一个函数。但是,您正在对运行时对象进行子类化。要使用您习惯在 OS X 中使用的大多数 Apple 方法,您需要改为子类化 NSObject。

    此外,您在接口中声明对象的超类,而不是在实现中。您需要将@implementation CDB : NSObject 更改为@implementation CDB,然后在您的头文件中放置@interface CDB : NSObject { ...

    【讨论】:

    • 如果我使用的是 OS X 但我使用的是 Ubuntu Linux 并且我没有使用 Apple 的 Objective-C 运行时...我使用的是 GNU Objective-C 运行时(gobjc 4.7 )
    • 哦,我完全意识到这一点。在使用 GNU 运行时时,您仍然可以使用 Foundation 框架。它应该可用。您可以在此处使用参考:blog.lyxite.com/2008/01/…
    猜你喜欢
    • 2012-07-06
    • 2020-08-10
    • 1970-01-01
    • 2012-04-01
    • 2011-04-04
    • 1970-01-01
    • 2017-06-03
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多