2014-04-23 13 views
73

Was ist der Unterschied zwischen gcc -pthread und gcc -lpthread, der beim Kompilieren von Multithread-Programmen verwendet wird?Unterschied zwischen -pthread und -lpthread beim Kompilieren

+2

Hoppla, ja. Hier ist das korrekte Duplikat: http://stackoverflow.com/q/2127797/694576 – alk

+0

Mögliches Duplikat von [Bedeutung von -pthread Flag beim Kompilieren] (https://stackoverflow.com/questions/2127797/gcc-significance-of -thread-flag-when-compiling) – jww

Antwort

87

-pthread weist den Compiler an, in der PThread-Bibliothek zu verknüpfen sowie die Kompilierung für Threads zu konfigurieren.

Zum Beispiel zeigt die folgende, die Makros, die definiert werden, wenn die -pthread Option auf dem GCC-Paket auf meinem Ubuntu-Rechner installiert 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 

Mit der -lpthread Option bewirkt, dass nur die pthread-Bibliothek verknüpft werden - Die vordefinierten Makros werden nicht definiert.

Fazit: Sie sollten die -pthread Option verwenden.


Hinweis: Die -pthread Option ist als plattformspezifische Option in der GCC-Dokumentation dokumentiert, so dass es möglicherweise nicht immer verfügbar sein. 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, die von GCC verwendet wurden, wie -pthreads (als Synonym für aufgeführt -pthread auf Solaris 2) und -mthread (für MinGW spezifische Thread-Unterstützung auf i386 und x86-64 Windows). Mein Verständnis ist, dass GCC versucht, -pthread einheitlich vorwärts gehen zu verwenden.

+2

Was komisch ist, weil es direkt POSIX widerspricht. POSIX schreibt vor, dass die Übergabe von "-lpthread" ausreicht, um die gesamte POSIX-Threading-Bibliothek zu erhalten. – fuz

+0

@FUZxxl Wenn "-lpthread" übergeben wird, erhält * die gesamte POSIX-Threading-Bibliothek. – immibis

+3

@immibis Nein, was ich meine ist, POSIX sagt, dass die Verbindung mit '-lpthread 'ausreichen sollte, um volle Pthreads-Unterstützung zu erhalten. Es sollten keine weiteren Kompilierungsflags benötigt werden. – fuz

4

-pthread Fügt Unterstützung für Multithreading mit der Pthreads-Bibliothek hinzu. Diese Option setzt Flags für den Präprozessor und den Linker (man gcc).

während

-lpthread kommt in Existenz, während es die Verknüpfung wird kein Einfluss während der Vorverarbeitung sein.