web-dev-qa-db-ja.com

-gccのlpthreadオプション

ご存知のように、Linux環境でpthreadライブラリを使用する場合は、pthread.hをインクルードし、-lpthreadオプションを使用してソースコードをコンパイルする必要があります。しかし、なぜ-lpthreadオプションを使用してコンパイルする必要があるのか​​わかりません。このオプションは冗長だと思います... gccがpthreadライブラリにリンクするようにpthread.hヘッダーファイルをインクルードすることをすでに宣言しているためです。 gccが#includeを読み取ってpthreadライブラリファイルを自動的にリンクしないのはなぜですか?

前もって感謝します。

11
sky

さてリンクコンパイルは2つの別々のフェーズです。

コンパイラがデータ型とシンボル名を理解できるように、ヘッダーpthread.hをインクルードします。これらは、ソースファイルで使用されますが、pthreadライブラリヘッダーファイルで定義/宣言されます。

-lpthreadを使用してpthreadlibrayにリンクし、リンカがリンク段階でpthreadライブラリ内のそれらのシンボルを実際に見つけられるようにします。

20
Alok Save

#include <pthread.h>コード内がライブラリにリンクされていません。コンパイル用のヘッダーのみが含まれます。これにより、コンパイラーは、含まれているさまざまな構造体、関数宣言などを確認できます。 -lpthreadは、実際にはリンカによってリンクが行われるようにします。したがって、インクルードはコンパイラに何が利用可能かを伝え、-lpthread実際には、プログラムが実行時にライブラリ内の関数を呼び出すことができます。

5
Dan Fego

GCCはヘッダーの包含によってトリガーされるライブラリの 自動リンク を実行しないため(MSVCとは対照的に、またはそう言われています)。

3
Fred Foo

ヘッダーファイルは、pthread関数とは何か、およびそれらをどのように呼び出すかを宣言するだけです。 -lpthreadは、実際の関数を含むライブラリ自体にリンクします。

コンパイラは、pthread.hの関数をどのように解決するのかわかりません。静的ライブラリ、システムによって提供されるもの、いくつかの互換性のある実装を使用したい場合があります-一体、別のソースファイルに自分で実装する場合があります。それはリンカー次第であり、コンパイラーには関係ありません。

2

ヘッダーファイルをインクルードすることにより、コンパイラーにどの関数を表示するかを指示します。ただし、これらの関数がpthread関数などの外部ライブラリにある場合は、実際にこれらの関数にアクセスできるように、このライブラリをプログラムにリンクする必要があります。それが-lpthreadやっています。

1
DarkDust

Pthread.hヘッダーファイルはposixスレッドプログラムに含まれていますが、pthreadのライブラリとリンクしているため、コンパイル時に-lpthreadが必要です注:-lpthread-lpcapすべては、ソースコード内の特定のライブラリをリンクできるgccコンパイラを備えたスイッチです。 (lpthreadは「linkpthread」ライブラリを意味します)

1
Rahul Raina