Saltar al contenido

Diferencia entre -pthread y -lpthread durante la compilación

Solución:

-pthread le dice al compilador que se vincule en la biblioteca pthread y que configure la compilación para subprocesos.

Por ejemplo, a continuación se muestran las macros que se definen cuando el -pthread La opción se usa en el paquete GCC instalado en mi máquina 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

Utilizando el -lpthread La opción solo hace que la biblioteca pthread esté vinculada; las macros predefinidas no se definen.

En pocas palabras: debes usar el -pthread opción.


Nota la -pthread La opción está documentada como una opción específica de la plataforma en los documentos de GCC, por lo que es posible que no siempre esté disponible. Sin embargo, está disponible en plataformas para las que los documentos de GCC no lo enumeran explícitamente (como i386 y x86-64); debe usarlo cuando esté disponible.

También tenga en cuenta que GCC ha utilizado otras opciones similares, como -pthreads (listado como sinónimo de -pthread en Solaris 2) y -mthread (para compatibilidad con subprocesos específicos de MinGW en Windows i386 y x86-64). Tengo entendido que GCC está intentando pasar a utilizar -pthread uniformemente avanzando.

-pthread Agrega soporte para subprocesos múltiples con la biblioteca pthreads. Esta opción establece indicadores tanto para el preprocesador como para el enlazador (man gcc).

tiempo

-lpthread entre en existencia mientras se enlaza, no habrá influencia durante el preprocesamiento.

Hay una respuesta aceptada, pero, en mi opinión, no proporciona suficiente contexto y conocimiento. De ahí esta respuesta adicional.


-lpthread es una solución para un problema que ya no existe (desde ~ 2005).

En los viejos tiempos, había implementaciones propietarias de la API de Pthreads que no eran compatibles con POSIX, como LinuxThreads. El estándar POSIX simplemente dice que si uno quiere un comportamiento compatible con POSIX, entonces debe vincularse con -lpthready la vinculación necesaria para vincular una implementación compatible con POSIX de la API de Pthreads, debería haber muchas implementaciones de la misma.

No hay múltiples implementaciones de la API de Pthreads en los sistemas operativos modernos. Y es por eso -lpthread ya no sirve para nada.


Compiladores como gcc y clang (y, probablemente, todos los compiladores compatibles con Linux) exigir utilizando -pthread opción de línea de comandos para compilar y vincular aplicaciones multiproceso compatibles con POSIX y eso es lo que se debe usar.

En tiempo de compilación, -pthread La opción manifiesta que se solicita la API de Pthread (puede haber varias API de subprocesos, por ejemplo, Solaris Threads) y define macros específicas de la plataforma (_REENTRANT en Linux _MT en Solaris).

En el momento del enlace, -pthread enlaces en las bibliotecas requeridas (si las hay) que implementan el comportamiento de la API de Pthreads compatible con POSIX.

Lo anterior deja claro por qué -lpthread no es necesario ni suficiente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *