9

これを行う方法についてはかなりの数のチュートリアルがあるようですが、それぞれわずかに異なります。誰かが私が受け取っているエラーメッセージを認識し、正しい方向に向けてくれることを願っています.

私のコードは、うーんです:

#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 NSLog (@"hello world");
 [pool drain];
 return 0;
}

コンパイルする前に、コンソールに次のように入力します。

. /usr/share/GNUstep/Makefiles/GNUstep.sh

私はコンパイルしようとします:

gcc `gnustep-config --objc-flags` -lgnustep-base h.m -o hello

そして得る:

/tmp/ccgLOnpY.o: 関数「main」内:
/home/ge/objective-c/hm:4: `objc_get_class' への未定義の参照
/home/ge/objective-c/hm:4: 「objc_msg_lookup」への未定義の参照
/home/ge/objective-c/hm:4: 「objc_msg_lookup」への未定義の参照
/home/ge/objective-c/hm:5: 「NSLog」への未定義の参照
/home/ge/objective-c/hm:6: 「objc_msg_lookup」への未定義の参照
/tmp/ccgLOnpY.o: 関数 `__objc_gnu_init' 内:
/home/ge/objective-c/hm:8: `__objc_exec_class' への未定義の参照
/tmp/ccgLOnpY.o:(.data.rel+0x0): `__objc_class_name_NSConstantString' への未定義の参照
/tmp/ccgLOnpY.o:(.data.rel+0x8): `__objc_class_name_NSAutoreleasePool' への未定義の参照
collect2: ld が 1 つの終了ステータスを返しました

誰かが私を正しい方向に向けることができますか?

ティア

4

4 に答える 4

33

リンクエラーの理由は、ライブラリをリンクする前にコンパイルでシンボルを確認した後にのみライブラリをリンクするリンカーの動作が原因である可能性があります。ライブラリ内のシンボルがまだ検出されていないため、ライブラリがリンクされていない場合に表示h.mされます。リンカーオプションを -lgnustep-base使用してシンボルが検出されない場合でも、ライブラリをリンクするようにリンカーに指示することができます。-Wl,--no-as-needed

gcc `gnustep-config --objc-flags` -Wl,--no-as-needed -lgnustep-base  h.m -o hello

または、ソースをコンパイルコマンドの先頭に移動するだけです。

gcc h.m  `gnustep-config --objc-flags` -lgnustep-base -o hello

-Wl, --no-as-needed観察されたリンカーの動作は、必要ではないかもしれないが、とにかくコンパイルでリンクされているライブラリのシンボルを検索してリンクすることを思いとどまらせることです。したがって、リンカーオプションを追加するのではなく、2番目のオプションを実行することをお勧めします。
お役に立てれば!

于 2012-07-11T04:20:15.303 に答える
11

libobjc にリンクする必要があります。修正は非常に簡単です。コンパイルするだけです:

gcc h.m `gnustep-config --objc-flags` -lobjc -lgnustep-base -o hello
于 2012-07-11T03:42:04.493 に答える
2

この方法は良いようです:

gcc h.m  `gnustep-config --objc-flags` -lgnustep-base -o hello
于 2013-03-03T09:15:13.687 に答える