gcc ไม่สามารถเชื่อมโยงไปยัง pthread ได้หรือไม่


17

ฉันเพิ่งติดตั้ง XUbuntu 11.10 64 บิต แต่ฉันมีปัญหาในการรวบรวมตัวอย่าง 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 '
collect2: ld ส่งคืนสถานะทางออก 1 รายการ

ไม่มีใครรู้ว่าสิ่งที่ทำให้เกิดปัญหาหรือไม่


มันเป็นความผิดของ stackexchange ที่คุณมีการรวมเปล่าในสองบรรทัดแรกหรือไม่? ควรมี#include <pthread.h>
Frg

ใช่ฉันใช้สภาพแวดล้อมก่อน มันควรจะแสดงอย่างถูกต้อง
chtlp


BTW โปรดรวบรวมด้วย-Wallคุณไม่มีส่วนหัว (และ sr_ ถูกต้อง)
Mat

คำตอบ:


26

ในgccคอมไพเลอร์รุ่นล่าสุดต้องการให้ไลบรารีติดตามวัตถุหรือไฟล์ต้นฉบับ

ดังนั้นเพื่อรวบรวมมันควรจะเป็น:

gcc pthread_sample.c -lpthread

ปกติแล้วแม้ว่าโค้ด pthread จะถูกรวบรวมด้วยวิธีนี้:

gcc -pthread pthread_sample.c

1
@Karlson คุณช่วยอธิบายได้ไหมว่าทำไมการรวมpthread.hไฟล์ถึงไม่เพียงพอสำหรับ gcc เพื่อแก้ไขการอ้างอิง?
Quazi Irfan

2
@iamcreasy เนื่องจากการประกาศไม่เหมือนกับคำจำกัดความ โปรแกรมจำเป็นต้องรู้ว่าโค้ดใดที่เรียกใช้งานฟังก์ชั่นเฉพาะ
Karlson


0

รวบรวมรหัสโดยใช้คำสั่งดังต่อไปนี้

gcc filename.c -lpthread -lrt

1
Hi! มันจะมีประโยชน์ถ้าคุณสามารถแก้ไขคำตอบของคุณเพื่ออธิบายว่าทำไมมันถึงทำงานได้และเพื่อเน้นว่าทำไมคุณคิดว่ามันเพิ่มบางอย่างที่คำตอบที่ยอมรับแล้วไม่ครอบคลุม
dhag
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.