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?


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

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


0

kompilasi kode menggunakan perintah berikut

gcc filename.c -lpthread -lrt

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.