gcc не может связаться с pthread?

17

Я недавно установил XUbuntu 11.10 64bit, но у меня проблема с компиляцией самого простого примера pthread.

Вот код 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); 
}

А вот и команда компиляции

gcc -lpthread pthread_simple.c

Результаты:

lptang @ tlp-linux: ~ / test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o: в функции `main ':
pthread_simple.c :(. text + 0x2c): неопределенная ссылка на `pthread_create '
pthread_simple.c :(. text + 0x46): неопределенная ссылка на `pthread_create '
pthread_simple.c :(. text + 0x57): неопределенная ссылка на `pthread_join '
pthread_simple.c :(. text + 0x68): неопределенная ссылка на `pthread_join '
collect2: ld вернул 1 статус выхода

Кто-нибудь знает, что является причиной проблемы?

chtlp
источник
Это ошибка stackexchange, что у вас есть пустые включения в первых двух строках? Там должно быть#include <pthread.h>
Frg
Да, я использовал предварительную среду. Теперь он должен отображаться правильно.
chtlp
Кстати, пожалуйста, скомпилируйте -Wall, у вас нет заголовков. (И sr_ это правильно.)
Мат

Ответы:

26

В последних версиях gccкомпилятора требуется, чтобы библиотеки следовали за объектами или исходными файлами.

Итак, для компиляции это должно быть:

gcc pthread_sample.c -lpthread

Обычно, хотя код pthread компилируется следующим образом:

gcc -pthread pthread_sample.c
Карлсон
источник
1
@Karlson Не могли бы вы объяснить, почему pthread.hдля разрешения ссылок gcc недостаточно просто включить файл?
Quazi Irfan
2
@iamcreasy Потому что объявление не совпадает с определением. Программа должна знать, где находится код, выполняющий определенную функцию.
Карлсон
1
gcc -o exectable_namme pthread_sample.c -lpthread
Родригес САУНГОУМИ ИСТОЧНИК
источник
3
Было бы полезно отредактировать ваш ответ, чтобы объяснить, почему он отличается от уже принятого ответа.
Ройма
0

компилировать код с помощью следующей команды

gcc filename.c -lpthread -lrt
user109578
источник
1
Здравствуй! Было бы полезно, если бы вы могли отредактировать свой ответ, чтобы объяснить, почему он работает, и подчеркнуть, почему вы считаете, что он добавляет то, что уже принятый ответ не охватывает.
Дхаг