gcc tidak dapat menautkan ke pthread?

17

Saya baru saja menginstal XUbuntu 11.10 64bit, tetapi saya mengalami masalah saat mengkompilasi contoh pthread yang paling sederhana.

Ini kodenya 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); 
}

Dan di sini adalah perintah kompilasi

gcc -lpthread pthread_simple.c

Hasil:

lptang @ tlp-linux: ~ / test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o: Dalam fungsi `main ':
pthread_simple.c :(. teks + 0x2c): referensi tidak terdefinisi ke `pthread_create '
pthread_simple.c :(. teks + 0x46): referensi tidak terdefinisi ke `pthread_create '
pthread_simple.c :(. teks + 0x57): referensi tidak terdefinisi ke `pthread_join '
pthread_simple.c :(. text + 0x68): referensi tidak terdefinisi ke `pthread_join '
collect2: ld mengembalikan 1 status keluar

Adakah yang tahu apa yang menyebabkan masalah?

chtlp
sumber
Apakah ini kesalahan stackexchange yang Anda miliki termasuk kosong dalam dua baris pertama? Seharusnya ada#include <pthread.h>
Frg
Ya, saya menggunakan lingkungan pra. Sekarang seharusnya ditampilkan dengan benar.
chtlp
BTW, silakan kompilasi dengan -Wall, Anda kehilangan header. (Dan sr_ sudah benar.)
Mat

Jawaban:

26

Dalam versi terbaru dari gcckompiler mengharuskan perpustakaan mengikuti objek atau file sumber.

Jadi untuk mengkompilasi ini harus:

gcc pthread_sample.c -lpthread

Biasanya meskipun kode pthread dikompilasi dengan cara ini:

gcc -pthread pthread_sample.c
Karlson
sumber
1
@Karlson Bisakah Anda jelaskan mengapa hanya memasukkan pthread.hfile tidak cukup bagi gcc untuk menyelesaikan referensi?
Quazi Irfan
2
@iamcreasy Karena deklarasi tidak sama dengan definisi. Program perlu tahu di mana kode yang menjalankan fungsi tertentu.
Karlson
1
gcc -o exectable_namme pthread_sample.c -lpthread
Rodrigue SAOUNGOUMI SOURPELE
sumber
3
Akan sangat membantu untuk mengedit jawaban Anda untuk menjelaskan mengapa ini berbeda dari jawaban yang sudah diterima.
roaima
0

kompilasi kode menggunakan perintah berikut

gcc filename.c -lpthread -lrt
pengguna109578
sumber
1
Hai! Akan sangat membantu jika Anda dapat mengedit jawaban Anda untuk menjelaskan mengapa itu bekerja, dan untuk menyoroti mengapa Anda berpikir itu menambahkan sesuatu yang tidak diterima jawaban yang sudah diterima.
Dhag