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.