コンパイル中の-pthreadと-lpthreadの違い


回答:


116

-pthread コンパイラーにpthreadライブラリーでリンクするように指示するとともに、スレッドのコンパイルを構成します。

たとえば、次の例は-pthread、UbuntuマシンにインストールされているGCCパッケージでオプションが使用されるときに定義されるマクロを示しています。

$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc          -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt 
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1

この-lpthreadオプションを使用しても、pthreadライブラリがリンクされるだけです。事前定義されたマクロは定義されません。

結論:-pthreadオプションを使用する必要があります。


注:-pthreadオプションはGCCドキュメントにプラットフォーム固有のオプションとして記載されているため、常に利用できるとは限りません。ただし、GCCのドキュメントに明示的にリストされていないプラットフォーム(i386やx86-64など)では利用できます。利用可能な場合は使用してください。

-pthreads-pthreadSolaris 2の同義語としてリストされている)や-mthread(i386およびx86-64 WindowsでのMinGW固有のスレッドサポートの)など、他の同様のオプションがGCCによって使用されていることにも注意してください。私の理解では、GCCは-pthread今後一律の使用に移行しようとしているということです。


2
これはPOSIXに直接矛盾するので奇妙です。POSIXでは-lpthread、POSIXスレッドライブラリ全体を取得するには、パスするだけで十分です。
fuz

@FUZxxl Passing -lpthread 、POSIXスレッドライブラリ全体を取得します。
user253751

5
@immibisいいえ、つまり、POSIXは、-lpthreadpthreadを完全にサポートするには、とのリンクで十分であると述べています。他のコンパイルフラグは必要ありません。
fuz

1
@alecov何のgccと間違っていることでコンパイルすることで-lpthreadはありませんが-pthread、私はすでに私の以前のコメントで明らかなように、pthreadのサポートを得るには不十分です。
fuz 2018年

2
@alecov POSIXでは、POSIX環境を構成してとリンクする場合、pthreadが機能する必要があります-lpthread。ただし、gccのドキュメントでは、これはpthreadのサポートを得るには不十分である可能性があることを示唆しています。あなたが提供しなかっ-lpthreadたり、ランダムな他のプロプライエタリなオプションを提供しなかった場合に何が起こるかについて私はまったく気にしません。-lpthreadpthreadを保証するためにPOSIXでのみ指定されており、gccでは十分ではないようです。
fuz

10

-pthreadpthreadsライブラリを使用したマルチスレッドのサポートを追加します。このオプションは、プリプロセッサとリンカーの両方にフラグを設定します(man gcc)。

ながら

-lpthread リンク中に存在し、前処理中に影響はありません。


4

受け入れられた答えはありますが、IMO、それは十分なコンテキストと洞察を提供していません。したがって、この余分な答え。


-lpthread 存在しない問題の解決策です(〜2005以降)。

昔は、LinuxThreadsのように、POSIXに準拠していないPthreads APIの独自の実装がありました。POSIX標準では、POSIX準拠の動作が必要な場合は、とリンクする必要があり、Pthreads APIのPOSIX準拠の実装をリンクするために必要なリンクは、実装が多数ある場合にのみ記載されています。-lpthread

最新のオペレーティングシステムでは、Pthreads APIの複数の実装はありません。そしてそれが-lpthreadもはや目的を果たさない理由です。


以下のようなコンパイラgccclang(と、おそらく、すべてのLinux互換のコンパイラ)が必要と使用-pthreadの両方のコンパイルとリンクPOSIX準拠のマルチスレッドアプリケーションを、その1が使用しなければならないものですためのコマンドラインオプションを。

コンパイル時に、-pthreadオプションはPthread APIが要求され(Solarisスレッドなどの複数のスレッドAPIが存在する可能性がある)ことを明示し、プラットフォーム固有のマクロ(_REENTRANTLinuxでは_MTSolaris)を定義します。

リンク時に、-pthreadPOSIX準拠のPthreads API動作を実装する必要なライブラリ(存在する場合)内のリンク。

上記により、なぜ-lpthread必要でも十分でもない理由が明らかになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.