Qual è la differenza tra gcc -pthread
e gcc -lpthread
che viene utilizzata durante la compilazione di programmi multithreading?Differenza tra -pthread e -lpthread durante la compilazione
risposta
-pthread
indica al compilatore di collegarsi alla libreria pthread e configurare la compilazione per i thread.
Ad esempio, il seguente mostra la macro che vengono definite quando l'opzione -pthread
si abitua sul pacchetto GCC installato sulla mia macchina Ubuntu:
$ 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
Utilizzando l'opzione -lpthread
fa sì che solo la libreria pthread da collegare - le macro predefinite non vengono definite.
Bottom line: è necessario utilizzare l'opzione -pthread
.
Nota: l'opzione -pthread
è documentata come opzione specifica piattaforma nella documentazione GCC, quindi potrebbe non essere sempre disponibile. Tuttavia, è disponibile su piattaforme che i doc del GCC non lo elencano esplicitamente (come i386 e x86-64) - dovresti usarlo quando disponibile.
Si noti inoltre che le altre opzioni simili sono state usate da GCC, come ad esempio -pthreads
(indicato come sinonimo di -pthread
su Solaris 2) e -mthread
(per il supporto filo MinGW-specifici su i386 e x86-64 di Windows). La mia comprensione è che GCC sta cercando di passare a utilizzare -pthread
in modo uniforme andando avanti.
Che è strano perché contraddice direttamente POSIX. POSIX stabilisce che passare '-lpthread' è sufficiente per ottenere l'intera libreria di threading POSIX. – fuz
@FUZxxl Passare '-lpthread' * fa * ottenere l'intera libreria di threading POSIX. – immibis
@immibis No, cosa intendo dire, POSIX dice che il collegamento con '-lpthread' dovrebbe essere sufficiente per ottenere il pieno supporto di pthreads. Non dovrebbero essere necessari altri flag di compilazione. – fuz
-pthread
Aggiunge il supporto per il multithreading con la libreria pthreads. Questa opzione imposta i flag sia per il preprocessore che per il linker (man gcc
).
mentre
-lpthread
viene in esistenza durante il collegamento non ci sarà alcuna influenza durante la pre-elaborazione.
Oops, sì. Ecco il duplicato corretto: http://stackoverflow.com/q/2127797/694576 – alk
Possibile duplicato di [Significance of -pthread flag durante la compilazione] (https://stackoverflow.com/questions/2127797/gcc-significance-of -pthread-flag-when-compiling) – jww