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 '
collection2: ld повернув 1 статус виходу

Хтось знає, що викликає проблему?


Чи є виною stackexchange, що ви порожні включаєте в перші два рядки? Має бути#include <pthread.h>
Пт

Так, я використовував попереднє середовище. Тепер він повинен відображатися правильно.
chtlp


BTW, будь ласка, складіть -Wall, вам не вистачає заголовків. (І sr_ вірно.)
Мат

Відповіді:


26

В останніх версіях gccкомпілятора потрібно, щоб бібліотеки дотримувалися об'єктних або вихідних файлів.

Отже, для складання цього слід:

gcc pthread_sample.c -lpthread

Зазвичай, хоча код pthread складається таким чином:

gcc -pthread pthread_sample.c

1
@Karlson Чи можете ви пояснити, чому просто включення pthread.hфайлу не достатньо для gcc для вирішення посилань?
Quazi Irfan

2
@iamcreasy Тому, що декларація не те саме, що визначення. Програма повинна знати, де знаходиться код, який виконує певну функцію.
Карлсон


0

компілювати код за допомогою наступної команди

gcc filename.c -lpthread -lrt

1
Привіт! Було б корисно, якщо ви зможете відредагувати свою відповідь, щоб пояснити, чому вона працює, та виділити, чому ви думаєте, що це додає щось, що вже прийнята відповідь не охоплює.
даг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.