Unterschied zwischen -pthread und -lpthread beim Kompilieren

Antworten:

116

-pthread Weist den Compiler an, eine Verknüpfung in der pthread-Bibliothek herzustellen und die Kompilierung für Threads zu konfigurieren.

Im Folgenden werden beispielsweise die Makros gezeigt, die definiert werden, wenn die -pthreadOption für das auf meinem Ubuntu-Computer installierte GCC-Paket verwendet wird:

$ 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

Wenn Sie diese -lpthreadOption verwenden, wird nur die pthread-Bibliothek verknüpft. Die vordefinierten Makros werden nicht definiert.

Fazit: Sie sollten die -pthreadOption verwenden.


Hinweis: Die -pthreadOption ist in den GCC-Dokumenten als plattformspezifische Option dokumentiert, sodass sie möglicherweise nicht immer verfügbar ist. Es ist jedoch auf Plattformen verfügbar, für die die GCC-Dokumente es nicht explizit auflisten (z. B. i386 und x86-64). Sie sollten es verwenden, wenn es verfügbar ist.

Beachten Sie auch, dass andere ähnliche Optionen von GCC verwendet wurden, z. B. -pthreads(als Synonym für -pthreadSolaris 2 aufgeführt) und -mthread(für MinGW-spezifische Thread-Unterstützung unter i386 und x86-64 Windows). Ich verstehe, dass GCC versucht, künftig -pthreadeinheitlich vorzugehen.

Michael Burr
quelle
2
Was seltsam ist, weil es POSIX direkt widerspricht. POSIX schreibt vor, dass das Übergeben -lpthreadausreicht, um die gesamte POSIX-Threading-Bibliothek abzurufen.
Fuz
@FUZxxl Passing -lpthread tut die ganze POSIX Threading - Bibliothek erhalten.
user253751
5
@immibis Nein, ich meine, POSIX sagt, dass das Verknüpfen mit -lpthreadausreichen sollte, um die volle Unterstützung für Pthreads zu erhalten. Es sollten keine weiteren Kompilierungsflags benötigt werden.
Fuz
1
@alecov Was an gcc falsch ist, ist, dass das Kompilieren mit, -lpthreadaber nicht -pthreadausreicht, um Pthread-Unterstützung zu erhalten, wie ich bereits in meinem vorherigen Kommentar klargestellt habe.
Fuz
2
@alecov POSIX schreibt vor, dass pthreads funktionieren müssen, wenn Sie eine POSIX-Umgebung konfigurieren und eine Verknüpfung mit herstellen -lpthread. Die gcc-Dokumentation deutet jedoch darauf hin, dass dies möglicherweise nicht ausreicht, um Unterstützung für pthreads zu erhalten. Dies ist der Punkt, den ich in den vorherigen Kommentaren angesprochen habe. Es ist mir überhaupt egal, was passiert, wenn Sie keine -lpthreadoder andere zufällige proprietäre Optionen bereitstellen . Nur -lpthreadwird von POSIX angegeben, um pthreads zu garantieren, und das scheint mit gcc nicht ausreichend zu sein.
Fuz
10

-pthreadFügt Unterstützung für Multithreading mit der pthreads-Bibliothek hinzu. Diese Option setzt Flags sowohl für den Präprozessor als auch für den Linker (man gcc ).

während

-lpthread entsteht während der Verknüpfung, es wird keinen Einfluss während der Vorverarbeitung geben.

Praveen Kumar
quelle
3

Es gibt eine akzeptierte Antwort, aber IMO bietet sie nicht genügend Kontext und Einsicht. Daher diese zusätzliche Antwort.


-lpthread ist eine Lösung für ein Problem, das nicht mehr existiert (seit ~ 2005).

Früher gab es proprietäre Implementierungen der Pthreads-API , die nicht POSIX-kompatibel waren, wie LinuxThreads . Der POSIX-Standard besagt lediglich, dass, wenn ein POSIX-kompatibles Verhalten -lpthreadgewünscht wird, eine Verknüpfung mit und eine Verknüpfung erforderlich ist, die zum Verknüpfen einer POSIX-kompatiblen Implementierung der Pthreads-API erforderlich ist, falls es viele Implementierungen davon gibt .

Es gibt keine Mehrfachimplementierungen der Pthreads-API in modernen Betriebssystemen. Und deshalb-lpthread erfüllt es keinen Zweck mehr.


Compiler wie gccund clang(und wahrscheinlich alle Linux-kompatiblen Compiler) benötigen Verwendung der -pthreadBefehlszeilenoption zum Kompilieren und Verknüpfen von POSIX-kompatiblen Multithread-Anwendungen. Dies muss verwendet werden.

Zur Kompilierungszeit zeigt die -pthreadOption an, dass die Pthread-API angefordert wird (es können mehrere Threading-APIs vorhanden sein, z. B. Solaris-Threads) und plattformspezifische Makros definiert ( _REENTRANTunter Linux) , _MTunter Solaris).

Zum Zeitpunkt der Verknüpfung -pthread Verknüpfung Verknüpfungen in erforderlichen Bibliotheken (falls vorhanden), die das POSIX-kompatible Pthreads-API-Verhalten implementieren.

Das Obige macht deutlich, warum dies -lpthreadweder notwendig noch ausreichend ist.

Maxim Egorushkin
quelle