21

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

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

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

2 に答える 2

28

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

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

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

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

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

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

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

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

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

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

于 2012-09-25T13:52:33.277 に答える
3

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

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

于 2013-06-07T02:17:28.403 に答える