ご存知のように、Linux環境でpthreadライブラリを使用する場合は、pthread.hをインクルードし、-lpthreadオプションを使用してソースコードをコンパイルする必要があります。しかし、なぜ-lpthreadオプションを使用してコンパイルする必要があるのかわかりません。このオプションは冗長だと思います... gccがpthreadライブラリにリンクするようにpthread.hヘッダーファイルをインクルードすることをすでに宣言しているためです。 gccが#includeを読み取ってpthreadライブラリファイルを自動的にリンクしないのはなぜですか?
前もって感謝します。
さてリンクとコンパイルは2つの別々のフェーズです。
コンパイラがデータ型とシンボル名を理解できるように、ヘッダーpthread.h
をインクルードします。これらは、ソースファイルで使用されますが、pthreadライブラリヘッダーファイルで定義/宣言されます。
-lpthread
を使用してpthreadlibrayにリンクし、リンカがリンク段階でpthreadライブラリ内のそれらのシンボルを実際に見つけられるようにします。
#include <pthread.h>
コード内がライブラリにリンクされていません。コンパイル用のヘッダーのみが含まれます。これにより、コンパイラーは、含まれているさまざまな構造体、関数宣言などを確認できます。 -lpthread
は、実際にはリンカによってリンクが行われるようにします。したがって、インクルードはコンパイラに何が利用可能かを伝え、-lpthread
実際には、プログラムが実行時にライブラリ内の関数を呼び出すことができます。
GCCはヘッダーの包含によってトリガーされるライブラリの 自動リンク を実行しないため(MSVCとは対照的に、またはそう言われています)。
ヘッダーファイルは、pthread関数とは何か、およびそれらをどのように呼び出すかを宣言するだけです。 -lpthread
は、実際の関数を含むライブラリ自体にリンクします。
コンパイラは、pthread.h
の関数をどのように解決するのかわかりません。静的ライブラリ、システムによって提供されるもの、いくつかの互換性のある実装を使用したい場合があります-一体、別のソースファイルに自分で実装する場合があります。それはリンカー次第であり、コンパイラーには関係ありません。
ヘッダーファイルをインクルードすることにより、コンパイラーにどの関数を表示するかを指示します。ただし、これらの関数がpthread
関数などの外部ライブラリにある場合は、実際にこれらの関数にアクセスできるように、このライブラリをプログラムにリンクする必要があります。それが-lpthread
やっています。
Pthread.hヘッダーファイルはposixスレッドプログラムに含まれていますが、pthreadのライブラリとリンクしているため、コンパイル時に-lpthread
が必要です注:-lpthread
-lpcap
すべては、ソースコード内の特定のライブラリをリンクできるgccコンパイラを備えたスイッチです。 (lpthreadは「linkpthread」ライブラリを意味します)