0

プログラムのコンパイルに次のコマンドを使用しました。

gcc -g -Wall -Werror -lpthread multi_thread_server.c -o multi_thread_socket_v4

undefined reference to <function_name>エラーが発生しました。

エラーを修正するために多くの試行錯誤を繰り返した後、最終的に(誤って)オプションをgcc次のように再配置しました。

gcc multi_thread_server.c -lpthread -Wall -Werror -o multi_thread_server -g

そしてそれはうまくいきました。

SO でこの質問を読みましたが、なぜそれが起こったのか理由がわかりました。

ここで知りたいのですが、使用されるオプションの順序に規則はありますgccか?

PS: には無限のオプションがあることはgcc知っています。オプションのカテゴリに応じた順序を知りたいです。

4

1 に答える 1

7

ライブラリを最後にリストします。

コンパイル後、GCC はリンクのためにファイルをリンカに渡します (スイッチでコンパイルのみを要求した場合のように、リンクが実行されない場合を除きます-c)。コマンドラインでファイル (または対応する入力) をリストした順序でファイルをリンカーに渡します。

リスト-lpthreadした (名前付きの pthread ライブラリ、libpthread.aまたは同様のものを意味する) に続いてmulti_thread_server.c(これは、 という名前のオブジェクト ファイルにコンパイルされますmulti_thread_server.o。したがって、リンカーは最初にライブラリを受け取り、次にオブジェクト ファイルを受け取ります。

リンカーは、ライブラリ ファイルを処理するときに、シンボルへの以前の参照を満たすために必要なシンボルの定義を提供するモジュールのみをライブラリ ファイルから抽出します。ライブラリは最初のファイルであるため、以前の参照はありません。リンカーが を処理multi_thread_server.oすると、参照が表示されますが、手遅れです。リンカーはライブラリに戻りません。

最初にリストmulti_thread_server.cすると、リンカーはmulti_thread_server.o最初に参照し、満たされていない参照があることを確認します。次に、リンカーがライブラリを処理するときに、それらの参照の定義を見つけて、ライブラリからそれらのモジュールを抽出します。

于 2013-08-22T19:30:58.390 に答える