これはリンカーの問題、ほとんどが未解決のシンボルを示していることを私は知っています。その問題を解決する/そのエラーメッセージを取り除くには、もっと多くの情報を提供する必要があることを私は知っています。 SO)でこの問題を解決することについて、すでに多くの質問があることを私は知っています。
私の質問は、makeとldを理解し、この行で何を(そして誰が)表現しようとしているのかを理解するのに役立つことを目的としています。
collect2: ld returned 1 exit status
まず最初に、gcc
およびg++
という名前のコマンドラインプログラムは、実際のプリプロセッサ/パーサーコンパイラ/アセンブラ/リンカーコマンドの傘(ラッパー)にすぎないことを知っておく必要があります。本名は、それぞれcpp
、cc1
またはcc1plus
、as
、および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
を呼び出すことで表示できるはずです。
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
...リンクフェーズ用。