0

Windows の Objective-C に gnustep を使用しています。クラスのインターフェイス ファイルと実装ファイルをメイン ファイルと一緒に保持すると、エラーなくコンパイルされ、期待どおりの出力が得られます。

次に例を示します。

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

ファイルを別々に保ちながら、プログラムを正常にコンパイルするにはどうすればよいですか

手伝ってくれてありがとう

よろしく

4

2 に答える 2

0

ここにリンカーエラーがあります。ほとんどの場合、myNewClass に必要なヘッダー ファイルが含まれていません。

于 2011-07-15T07:48:32.917 に答える
0

これが古いことは知っていますが、エラーが別のファイルにある場合に備えて、コンパイルされたファイルの名前を再確認してください。

理由: クラスmyNewClassは上記のコードで参照されておらず、Foundation 以外のインポートはありません。

コード コメント内のファイルの名前と、コンパイルしているように見えるファイルの名前が異なります。

// File "test.m"

gcc `gnustep-config --objc-flags` -o program program.m

一見すると、指定されたコードは分割時にコンパイルされるはずです。

また、「「コンパイル済みファイル」をインクルードするにはどうすればよいですか?」という質問については、.o ファイルを意味すると仮定すると、ヘッダー ファイル (.h) をインクルードし、コンパイラが一致する .o ファイルを見つけられるようにするだけです。 . 関連: C でオブジェクト ファイルをリンクするにはどうすればよいですか? 「アーキテクチャ x86_64 の未定義のシンボル」で失敗する

于 2015-02-05T07:06:26.337 に答える