Was ist der Unterschied zwischen gcc -pthread
und gcc -lpthread
was wird beim Kompilieren von Multithread-Programmen verwendet?
Was ist der Unterschied zwischen gcc -pthread
und gcc -lpthread
was wird beim Kompilieren von Multithread-Programmen verwendet?
Antworten:
-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 -pthread
Option 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 -lpthread
Option verwenden, wird nur die pthread-Bibliothek verknüpft. Die vordefinierten Makros werden nicht definiert.
Fazit: Sie sollten die -pthread
Option verwenden.
Hinweis: Die -pthread
Option 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 -pthread
Solaris 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 -pthread
einheitlich vorzugehen.
-lpthread
ausreicht, um die gesamte POSIX-Threading-Bibliothek abzurufen.
-lpthread
tut die ganze POSIX Threading - Bibliothek erhalten.
-lpthread
ausreichen sollte, um die volle Unterstützung für Pthreads zu erhalten. Es sollten keine weiteren Kompilierungsflags benötigt werden.
-lpthread
aber nicht -pthread
ausreicht, um Pthread-Unterstützung zu erhalten, wie ich bereits in meinem vorherigen Kommentar klargestellt habe.
-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 -lpthread
oder andere zufällige proprietäre Optionen bereitstellen . Nur -lpthread
wird von POSIX angegeben, um pthreads zu garantieren, und das scheint mit gcc nicht ausreichend zu sein.
-pthread
Fü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.
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 -lpthread
gewü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 gcc
und clang
(und wahrscheinlich alle Linux-kompatiblen Compiler) benötigen Verwendung der -pthread
Befehlszeilenoption zum Kompilieren und Verknüpfen von POSIX-kompatiblen Multithread-Anwendungen. Dies muss verwendet werden.
Zur Kompilierungszeit zeigt die -pthread
Option an, dass die Pthread-API angefordert wird (es können mehrere Threading-APIs vorhanden sein, z. B. Solaris-Threads) und plattformspezifische Makros definiert ( _REENTRANT
unter Linux) , _MT
unter 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 -lpthread
weder notwendig noch ausreichend ist.