O gcc não pode vincular ao pthread?

17

Eu instalei recentemente o XUbuntu 11.10 64bit, mas estou tendo problemas para compilar o exemplo mais simples de pthread.

Aqui está o código pthread_simple.c:

#include <stdio.h>
#include <pthread.h> 
main()  {
  pthread_t f2_thread, f1_thread; 
  void *f2(), *f1();
  int i1,i2;
  i1 = 1;
  i2 = 2;
  pthread_create(&f1_thread,NULL,f1,&i1);
  pthread_create(&f2_thread,NULL,f2,&i2);
  pthread_join(f1_thread,NULL);
  pthread_join(f2_thread,NULL);
}
void *f1(int *x){
  int i;
  i = *x;
  sleep(1);
  printf("f1: %d",i);
  pthread_exit(0); 
}
void *f2(int *x){
  int i;
  i = *x;
  sleep(1);
  printf("f2: %d",i);
  pthread_exit(0); 
}

E aqui está o comando de compilação

gcc -lpthread pthread_simple.c

Os resultados:

lptang @ tlp-linux: ~ / test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o: Na função `main ':
pthread_simple.c :(. text + 0x2c): referência indefinida a `pthread_create '
pthread_simple.c :(. text + 0x46): referência indefinida a `pthread_create '
pthread_simple.c :(. text + 0x57): referência indefinida a `pthread_join '
pthread_simple.c :(. text + 0x68): referência indefinida a `pthread_join '
collect2: ld retornou 1 status de saída

Alguém sabe o que está causando o problema?

chtlp
fonte
É culpa da stackexchange que você tenha inclusões vazias nas duas primeiras linhas? Deveria haver um#include <pthread.h>
Frg
Sim, eu usei o ambiente pré. Agora ele deve ser exibido corretamente.
Chtlp 04/03/12
BTW, compile com -Wall, você está com cabeçalhos ausentes. (E sr_ está correto.) #
Mat

Respostas:

26

Nas versões mais recentes do gcccompilador, é necessário que as bibliotecas sigam o objeto ou os arquivos de origem.

Então, para compilar isso, deve ser:

gcc pthread_sample.c -lpthread

Normalmente, embora o código pthread seja compilado desta maneira:

gcc -pthread pthread_sample.c
Karlson
fonte
11
@Karlson Você pode explicar por que apenas incluir o pthread.harquivo não é suficiente para o gcc resolver as referências?
Quazi Irfan
2
@iamcreasy Porque declaração não é a mesma que definição. O programa precisa saber onde está o código que está executando uma função específica.
Karlson
1
gcc -o exectable_namme pthread_sample.c -lpthread
Rodrigue SAOUNGOUMI SOURPELE
fonte
3
Seria útil editar sua resposta para explicar por que isso é diferente da resposta já aceita.
roaima
0

compilar código usando o seguinte comando

gcc filename.c -lpthread -lrt
user109578
fonte
11
Oi! Seria útil se você pudesse editar sua resposta para explicar por que ela funciona e para destacar por que você acha que ela adiciona algo que a resposta já aceita não cobre.
dhag