Diferença entre -pthread e -lpthread durante a compilação

Respostas:

116

-pthread diz ao compilador para se vincular à biblioteca pthread, bem como configurar a compilação para threads.

Por exemplo, o seguinte mostra as macros que são definidas quando a -pthreadopção é usada no pacote GCC instalado em minha 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

Usar a -lpthreadopção apenas faz com que a biblioteca pthread seja vinculada - as macros predefinidas não são definidas.

Resumindo: você deve usar a -pthreadopção.


Observação: a -pthreadopção está documentada como uma opção específica da plataforma nos documentos do GCC, portanto, pode nem sempre estar disponível. No entanto, ele está disponível em plataformas para as quais os documentos do GCC não o listam explicitamente (como i386 e x86-64) - você deve usá-lo quando disponível.

Observe também que outras opções semelhantes foram usadas pelo GCC, como -pthreads(listado como sinônimo de -pthreadno Solaris 2) e -mthread(para suporte a thread específico para MinGW no Windows i386 e x86-64). Meu entendimento é que o GCC está tentando passar a usar -pthreaduniformemente daqui para frente.

Michael Burr
fonte
2
O que é estranho porque contradiz diretamente POSIX. POSIX determina que passar -lpthreadé suficiente para obter toda a biblioteca de threading POSIX.
fuz
@FUZxxl Passing -lpthread faz obter toda a biblioteca de threading POSIX.
user253751
5
@immibis Não, o que quero dizer é que POSIX diz que a vinculação com -lpthreaddeve ser suficiente para obter suporte completo para pthreads. Nenhum outro sinalizador de compilação deve ser necessário.
fuz
1
@alecov O que há de errado com o gcc é que compilar com -lpthreadmas não -pthreadé insuficiente para obter suporte para pthread, como já esclareci em meu comentário anterior.
fuz
2
@alecov POSIX determina que pthreads deve funcionar se você configurar um ambiente POSIX e se conectar com -lpthread. No entanto, a documentação do gcc sugere que isso pode ser insuficiente para obter suporte para pthreads, que é o ponto que mencionei nos comentários anteriores. Eu não me importo com o que acontece se você não fornecer -lpthreadalgumas outras opções proprietárias aleatórias. Only -lpthreadé especificado por POSIX para garantir pthreads e isso não parece ser suficiente com gcc.
fuz
10

-pthreadAdiciona suporte para multithreading com a biblioteca pthreads. Esta opção define sinalizadores para o pré-processador e o vinculador ( man gcc).

enquanto

-lpthread vem a existir durante a ligação, não haverá influência durante o pré-processamento.

Praveen Kumar
fonte
4

Existe uma resposta aceita, mas, IMO, ela não fornece contexto e visão suficientes. Daí esta resposta extra.


-lpthread é uma solução para um problema que não existe mais (desde ~ 2005).

Antigamente, havia implementações proprietárias da API Pthreads que não eram compatíveis com POSIX, como LinuxThreads . O padrão POSIX meramente diz que se alguém deseja um comportamento compatível com POSIX, então deve-se vincular -lpthreade vincular uma implementação compatível com POSIX da API Pthreads, caso haja muitas implementações dela .

Não há implementações múltiplas da API Pthreads em sistemas operacionais modernos. E é por isso que -lpthreadnão serve mais a nenhum propósito.


Compiladores como gcce clang(e, provavelmente, todos os compiladores compatíveis com Linux) requerem o uso da -pthreadopção de linha de comando tanto para compilar quanto para vincular aplicativos multiencadeados compatíveis com POSIX e é isso que se deve usar.

Em tempo de compilação, a -pthreadopção manifesta que a API Pthread é solicitada (pode haver várias APIs de threading, por exemplo, Solaris Threads) e define macros específicas da plataforma ( _REENTRANTno Linux , _MTno Solaris).

No momento do link, -pthreadlinks em bibliotecas necessárias (se houver) que implementam o comportamento da API Pthreads compatível com POSIX.

O que foi dito acima deixa claro porque -lpthreadnão é necessário nem suficiente.

Maxim Egorushkin
fonte