Referência indefinida para pthread_create no Linux

376

Peguei a seguinte demonstração na Web em https://computing.llnl.gov/tutorials/pthreads/

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

Mas quando eu o compilo na minha máquina (executando o Ubuntu Linux 9.04), recebo o seguinte erro:

corey@ubuntu:~/demo$ gcc -o term term.c
term.c: In function main’:
term.c:23: warning: incompatible implicit declaration of built-in function exit
/tmp/cc8BMzwx.o: In function `main':
term.c:(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

Isso não faz sentido para mim, porque o cabeçalho inclui pthread.h, que deve ter a pthread_createfunção. Alguma idéia do que está errado?

Ralph
fonte
6
Adicionalmente: dependendo da plataforma, pode ser necessário (a) um compilador diferente para segmentos, (b) um libc diferente para segmentos (ou seja -lc_r), (c) -threadou -threadsou outro, em vez de ou em adição a -lpthread.
ephemient
Um pouco acima desse exemplo, você verá uma tabela com os comandos corretos do compilador, seja GCC, IBM, etc. 'Russian empregado' está correto.
Jonathon Reinhart
8
Você pode desmarcar minha resposta, para que eu possa excluí-la (e marcar a que está realmente correta, qual é a mais votada)?
Pavel Minaev 22/11/2012
3
-lpthreadé necessário durante a compilação
Como Chen
5
soluçãoLDFLAGS= -pthread -lpthread
dsnk

Respostas:

696

Até agora, as duas respostas a esta pergunta estão incorretas .
Para Linux, o comando correto é:

gcc -pthread -o term term.c

Em geral, as bibliotecas devem seguir fontes e objetos na linha de comando, e -lpthreadnão é uma "opção", é uma especificação de biblioteca. Em um sistema com apenas libpthread.ainstalado,

gcc -lpthread ...

falhará ao vincular.

Russo empregado
fonte
2
+1 esta solução funcionou ... outros não. Além disso, a sugestão de que 'bibliotecas devem seguir fontes e objetos' é um ótimo conselho - uma citação ou explicação adicional seria ótimo.
sholsapp
7
@sholsapp Aqui está a explicação: webpages.charter.net/ppluzhnikov/linker.html
Russian
Isso ainda estava errado para mim até eu colocar -lpthread no final do meu comando. gcc term.c -lpthread
CornSmith
Acabei de encontrar um problema ao compilar o snortsam no Ubuntu 14.04, que na verdade possui libpthread.a e libpthread.so. Eu estava recebendo undefined reference to 'pthread_cancel'e undefined reference to 'pthread_create'erros. Me deparei com este post do SO e pensei em experimentar a resposta do Employed Russian. Abri makesnortsam.shno VI e executei o comando :%s/lpthread/pthread/gpara substituir lpthread por pthread, para que ele usasse em -pthreadvez de -lpthreadcompilar. Pude então compilar snortsam. Obrigado empregada russa!
dcarrith
5
Para quem usa CODEBLOCKS: Adicionar -pthreadàs opções de criação do projeto -> Configurações do vinculador -> Outras opções do vinculador.
user3728501
39

no eclipse

propriedades-> c / c ++ Build-> configuração-> vinculador GCC C ++-> bibliotecas na parte superior adicionam "pthread"

sam
fonte
Mesma dica applyes em código :: projeto (e eu acho que os outros IDE também)
Fil
19

Executando no terminal Linux, o que funcionou para mim foi compilar usando o seguinte comando (suponha que o arquivo c que eu quero compilar se chame test.c):

gcc -o test test.c -pthread

Espero que ajude alguém!

Alexander Nenartovich
fonte
19

Para Linux, o comando correto é:

gcc -o term term.c -lpthread
  1. você deve colocar -lpthread logo após o comando compile, este comando informará o compilador para executar o programa com a biblioteca pthread.h.
  2. gcc -l vincula-se a um arquivo da biblioteca.Link -l com o nome da biblioteca sem o prefixo lib.
Gopika BG
fonte
Não é uma boa ideia usar um sinalizador não padrão quando existir um sinalizador padrão que tenha a mesma função na sua plataforma.
David Schwartz
12

Se você estiver usando o cmake, poderá usar:

add_compile_options(-pthread)

Ou

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
Jayhello
fonte
7

Compile-o assim: gcc demo.c -o demo -pthread

leesagacious
fonte
6

Eu acredito que a maneira correta de adicionar pthreadno CMakeé com o seguinte

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)
Rufus
fonte
4

No Visual Studio 2019, especifique -pthreadnas páginas de propriedades do projeto em:

Linker -> Linha de Comando -> Opções Adicionais

Digite na -pthreadcaixa de texto.

WBuck
fonte
3

Você precisa usar a opção -lpthreadcom gcc.

xiaolong
fonte
7
informação errada! -lpthreadnão é uma "opção", especifica uma biblioteca.
uma opção de linha de comando (em contraste com um argumento de linha de comando)
Alexander Stohr
3

você só precisa adicionar "pthread" nas propriedades => compilação do C / C ++ => vinculador do GCC C ++ => bibliotecas => parte superior "bibliotecas (-l)". é isso aí

sam
fonte
2

verifique a página de manual e você receberá.

Compile e vincule com -pthread.

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);


       Compile and link with -pthread.
       ....
kalu Wang
fonte
0

Em Anjuta, vá para o menu Build e, em seguida, configure Project. Na caixa Configurar opções, adicione:

LDFLAGS='-lpthread'

Espero que ajude alguém também ...

naXa
fonte
0

Às vezes, se você usar várias bibliotecas, verifique a dependência da biblioteca. (por exemplo, -lpthread -lSDL ... <==> ... -lSDL -lpthread)

user1793997
fonte