web-dev-qa-db-ja.com

「collect2:ldが1つの終了ステータスを返しました」を分析してみましょう。

これはリンカーの問題、ほとんどが未解決のシンボルを示していることを私は知っています。その問題を解決する/そのエラーメッセージを取り除くには、もっと多くの情報を提供する必要があることを私は知っています。 SO)でこの問題を解決することについて、すでに多くの質問があることを私は知っています。

私の質問は、makeとldを理解し、この行で何を(そして誰が)表現しようとしているのかを理解するのに役立つことを目的としています。

collect2: ld returned 1 exit status
  • 「collect2:」とはどういう意味ですか?それはmakeが呼び出すステップですか?その名前の実行可能ファイルがシステムに見つかりません。
  • Ldを使用しているということですか? g ++がリンクを実行するようにプロジェクト/ Makefileを構成したのに、なぜLD
  • 誰がそのメッセージを書いていますか?作る? ld? g ++?
  • 可能な終了コードの意味のあるリストはありますか?
15
lImbus

まず最初に、gccおよびg++という名前のコマンドラインプログラムは、実際のプリプロセッサ/パーサーコンパイラ/アセンブラ/リンカーコマンドの傘(ラッパー)にすぎないことを知っておく必要があります。本名は、それぞれcppcc1またはcc1plusas、およびldです。 GCCは、それらの使用法、コマンドラインインターフェイスを統合し、それらに意味のあるデフォルト(および必須)のオプションのセットを提供するのに役立ちます。たとえば、ldを使用してバイナリを直接リンクすることは非常に困難です。ldを20以上(IIRC)の正しいオプションすべてで実行しないと、機能しなくなります。

これで、次のことがわかります。

Ldを使用しているということですか? g ++がリンクを実行するようにプロジェクト/ Makefileを構成したのに、なぜLD

むしろ、GCCを呼び出すことを意味しますが、次にLDを呼び出します。 GCC自体は何も知りません。単なるラッパーであるため、コンパイルもリンクもしません。 (wc -c/usr/bin/gccを実行すると、数キロバイトしかないことに驚かされます。/usr/libexec/gcc/cc1plusについても同じことを実行して、恐ろしい真実を見つけてください。サイズは数10メガバイトです!)

「collect2:」とはどういう意味ですか?それはmakeが呼び出すステップですか?その名前の実行可能ファイルがシステムに見つかりません。

Collect2は、gccとldの間の別のレベルの間接参照でもあります。 公式ウェブサイトで詳細をご覧ください。

そのメッセージを書いているのは誰ですか?作る? ld? g ++?

G ++(私が知る限りそれだけです)またはcollect2自体のどちらかかもしれません。

可能な終了コードの意味のあるリストはありますか?

意味は従来のものです。ゼロは成功を意味し、ゼロ以外は失敗を意味します。網羅的なリストが存在する場合は、man ldを呼び出すことで表示できるはずです。

22
user529758

H2CO3がほのめかしているように、手動でリンクするのがどれほど難しいかを理解するには、詳細スイッチ(-v)を指定してg ++を実行してみてください。プロセスのすべてのステップ(前処理、コンパイル、アセンブル、リンク)のコマンドを(他の情報とともに)出力します。

たとえば、Cygwinでg ++を使用して単純な「Hello、World」を構築すると、次のようになります。

/usr/lib/gcc/i686-pc-cygwin/3.4.4/collect2.exe -Bdynamic --dll-search-prefix=cyg
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../crt0.o -L . -L/usr/lib/gcc/i686-pc-cygwin/3.4.4
-L/usr/lib/gcc/i686-pc-cygwin/3.4.4 -L/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../..
/tmp/cc4btl0k.o -lfoo -lstdc++ -lgcc -lcygwin -luser32 -lkernel32 -ladvapi32 -lshell32 -lgcc

...リンクフェーズ用。

3
joshbodily