gcc nie może połączyć się z pthread?

17

Niedawno zainstalowałem XUbuntu 11.10 64bit, ale mam problem ze skompilowaniem najprostszego przykładu pthread.

Oto kod 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); 
}

A oto polecenie kompilacji

gcc -lpthread pthread_simple.c

Wyniki:

lptang @ tlp-linux: ~ / test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o: W funkcji `main ':
pthread_simple.c :(. text + 0x2c): niezdefiniowane odniesienie do `pthread_create '
pthread_simple.c :(. text + 0x46): niezdefiniowane odniesienie do `pthread_create '
pthread_simple.c :(. text + 0x57): niezdefiniowane odniesienie do `pthread_join '
pthread_simple.c :(. text + 0x68): niezdefiniowane odniesienie do `pthread_join '
collect2: ld zwrócił 1 status wyjścia

Czy ktoś wie, co jest przyczyną problemu?

chtlp
źródło
Czy to wina Stackexchange, że masz puste, zawiera w pierwszych dwóch wierszach? Powinny być#include <pthread.h>
Frg
Tak, korzystałem ze środowiska wstępnego. Powinien teraz wyświetlać się poprawnie.
chtlp,
BTW, proszę skompilować z -Wall, brakuje nagłówków. (I sr_ jest poprawny.)
Mat.

Odpowiedzi:

26

W najnowszych wersjach gcckompilatora wymaga się, aby biblioteki podążały za obiektami lub plikami źródłowymi.

Aby to skompilować, powinno to być:

gcc pthread_sample.c -lpthread

Zwykle kod pthread jest kompilowany w ten sposób:

gcc -pthread pthread_sample.c
Karlson
źródło
1
@Karlson Czy możesz wyjaśnić, dlaczego samo dołączenie pthread.hpliku nie wystarczy, aby gcc rozpoznało odniesienia?
Quazi Irfan
2
@iamcreasy Ponieważ deklaracja nie jest tym samym co definicja. Program musi wiedzieć, gdzie znajduje się kod wykonujący określoną funkcję.
Karlson
1
gcc -o exectable_namme pthread_sample.c -lpthread
Rodrigue SAOUNGOUMI SOURPELE
źródło
3
Pomocna byłaby edycja odpowiedzi w celu wyjaśnienia, dlaczego różni się ona od już zaakceptowanej odpowiedzi.
roaima,
0

skompiluj kod za pomocą następującego polecenia

gcc filename.c -lpthread -lrt
użytkownik109578
źródło
1
Cześć! Byłoby pomocne, gdybyś mógł edytować swoją odpowiedź, aby wyjaśnić, dlaczego to działa, i podkreślić, dlaczego uważasz, że dodaje coś, czego nie zaakceptowała już zaakceptowana odpowiedź.
dhag