gcc không thể liên kết đến pthread?


16

Gần đây tôi đã cài đặt XUbfox 11.10 64bit, nhưng tôi gặp vấn đề khi biên dịch ví dụ pthread đơn giản nhất.

Đây là mã 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); 
}

Và đây là lệnh biên dịch

gcc -lpthread pthread_simple.c

Kết quả:

lptang @ tlp-linux: ~ / test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o: Trong hàm `main ':
pthread_simple.c :(. text + 0x2c): tham chiếu không xác định đến `pthread_create '
pthread_simple.c :(. text + 0x46): tham chiếu không xác định đến `pthread_create '
pthread_simple.c :(. text + 0x57): tham chiếu không xác định đến `pthread_join '
pthread_simple.c :(. text + 0x68): tham chiếu không xác định đến `pthread_join '
coll2: ld trả về 1 trạng thái thoát

Có ai biết những gì gây ra vấn đề?


Có phải lỗi của stackexchange mà bạn có bao gồm trong hai dòng đầu tiên không? Cần có một#include <pthread.h>
Frg

Vâng, tôi đã sử dụng môi trường trước. Bây giờ nó sẽ hiển thị chính xác.
chtlp


BTW, vui lòng biên dịch với -Wall, bạn đang thiếu các tiêu đề. (Và sr_ là chính xác.)
Mat

Câu trả lời:


26

Trong các phiên bản mới nhất của gcctrình biên dịch yêu cầu các thư viện theo dõi các tệp đối tượng hoặc nguồn.

Vì vậy, để biên dịch này, nó phải là:

gcc pthread_sample.c -lpthread

Thông thường mặc dù mã pthread được biên dịch theo cách này:

gcc -pthread pthread_sample.c

1
@Karlson Bạn có thể giải thích tại sao chỉ bao gồm pthread.htệp không đủ để gcc giải quyết các tham chiếu không?
Quazi Irfan

2
@iamcreasy Vì khai báo không giống như định nghĩa. Chương trình cần biết mã thực thi một chức năng cụ thể ở đâu.
Karlson


0

biên dịch mã bằng lệnh sau

gcc filename.c -lpthread -lrt

1
Chào! Sẽ rất hữu ích nếu bạn có thể chỉnh sửa câu trả lời của mình để giải thích lý do tại sao nó hoạt động và để làm nổi bật lý do tại sao bạn nghĩ rằng nó bổ sung một cái gì đó mà câu trả lời đã được chấp nhận không bao gồm.
dhag
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.