การอ้างอิงที่ไม่ได้กำหนดถึง pthread_create ใน Linux


376

ฉันเลือกตัวอย่างต่อไปนี้จากเว็บจากhttps://computing.llnl.gov/tutorials/pthreads/

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

แต่เมื่อฉันรวบรวมบนเครื่องของฉัน (ใช้ Ubuntu Linux 9.04) ฉันได้รับข้อผิดพลาดดังต่อไปนี้:

corey@ubuntu:~/demo$ gcc -o term term.c
term.c: In function main’:
term.c:23: warning: incompatible implicit declaration of built-in function exit
/tmp/cc8BMzwx.o: In function `main':
term.c:(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

สิ่งนี้ไม่สมเหตุสมผลสำหรับฉันเพราะส่วนหัวรวมถึงpthread.hซึ่งควรมีpthread_createฟังก์ชั่น ความคิดใด ๆ ที่ผิดปกติ?


6
นอกจากนี้: ขึ้นอยู่กับแพลตฟอร์มคุณอาจต้อง (ก) คอมไพเลอร์ที่แตกต่างกันสำหรับกระทู้, (ข) libc แตกต่างกันสำหรับหัวข้อ (เช่น-lc_r), (ค) -threadหรือ-threadsหรืออื่น ๆ -lpthreadแทนหรือนอกเหนือไปจาก
ephemient

เหนือตัวอย่างเล็ก ๆ น้อย ๆ คุณจะเห็นตารางของคำสั่งคอมไพเลอร์ที่ถูกต้องไม่ว่าจะเป็น GCC, IBM และอื่น ๆ 'ลูกจ้างรัสเซีย' นั้นถูกต้อง
Jonathon Reinhart

8
คุณช่วยกรุณายกเลิกการทำเครื่องหมายคำตอบของฉันเพื่อให้ฉันสามารถลบ (และทำเครื่องหมายคำตอบที่ถูกต้องจริงซึ่งเป็นคำที่ได้รับคะแนนสูงสุด)
Pavel Minaev

3
-lpthreadเป็นสิ่งจำเป็นในระหว่างการรวบรวม
วิธีเฉิ

5
ทางออกLDFLAGS= -pthread -lpthread
dsnk

คำตอบ:


696

ทั้งสองคำตอบสำหรับคำถามนี้เพื่อให้ห่างไกลมีความไม่ถูกต้อง
สำหรับ Linux คำสั่งที่ถูกต้องคือ:

gcc -pthread -o term term.c

โดยทั่วไปแล้วไลบรารีควรทำตามแหล่งที่มาและวัตถุในบรรทัดคำสั่งและ-lpthreadไม่ใช่ตัวเลือก "" เป็นข้อกำหนดของไลบรารี บนระบบที่มีการlibpthread.aติดตั้งเท่านั้น

gcc -lpthread ...

จะล้มเหลวในการเชื่อมโยง


2
+1 โซลูชันนี้ทำงานได้ ... คนอื่นไม่ได้ นอกจากนี้ข้อเสนอแนะที่ 'ห้องสมุดควรทำตามแหล่งที่มาและวัตถุ' เป็นคำแนะนำที่ดี - การอ้างอิงหรือคำอธิบายเพิ่มเติมจะดีมาก
sholsapp

7
@sholsapp นี่คือคำอธิบาย: webpages.charter.net/ppluzhnikov/linker.html
Employed รัสเซีย

สิ่งนี้ยังคงมีข้อผิดพลาดสำหรับฉันจนกว่าฉันจะใส่ -lpthread ที่ส่วนท้ายสุดของคำสั่งของฉัน gcc term.c -lpthread
CornSmith

ฉันเพิ่งพบปัญหาในการรวบรวมsnortsamบน Ubuntu 14.04 ซึ่งจริงๆแล้วมีทั้ง libpthread.a และ libpthread.so ฉันได้รับundefined reference to 'pthread_cancel'และundefined reference to 'pthread_create'ข้อผิดพลาด ฉันเจอโพสต์ SO นี้และคิดว่าฉันจะลองใช้คำตอบของรัสเซีย ฉันเปิดขึ้นmakesnortsam.shใน VI และรันคำสั่ง:%s/lpthread/pthread/gเพื่อแทนที่ lpthread ด้วย pthread เพื่อที่จะใช้-pthreadแทน-lpthreadเมื่อรวบรวม ฉันสามารถรวบรวม snortsam ได้ ขอบคุณลูกจ้างชาวรัสเซีย!
dcarrith

5
สำหรับทุกคนที่ใช้ CODEBLOCKS: เพิ่ม-pthreadในตัวเลือกการสร้างโครงการ -> การตั้งค่าตัวเชื่อมโยง -> ตัวเลือกตัวเชื่อมโยงอื่น
user3728501

39

ในคราส

Properties-> c / c ++ Build-> setting-> GCC C ++ linker-> ไลบรารีในส่วนบนเพิ่ม "pthread"


เคล็ดลับเดียวกันนำไปใช้ในรหัส :: โครงการ (และฉันคิดว่าคนอื่น IDE ด้วย)
Fil

19

ทำงานจากเทอร์มินัล Linux สิ่งที่ใช้ได้ผลสำหรับฉันคือการคอมไพล์โดยใช้คำสั่งต่อไปนี้ (สมมติว่าไฟล์ c ที่ฉันต้องการคอมไพล์เรียกว่า test.c):

gcc -o test test.c -pthread

หวังว่ามันจะช่วยให้ใครบางคน!


19

สำหรับ Linux คำสั่งที่ถูกต้องคือ:

gcc -o term term.c -lpthread
  1. คุณต้องใส่ -lpthread หลังจากคำสั่งคอมไพล์คำสั่งนี้จะบอกให้คอมไพเลอร์เรียกใช้งานโปรแกรมด้วยไลบรารี pthread.h
  2. ลิงก์ gcc -l พร้อมไฟล์ไลบรารีลิงก์ -l พร้อมชื่อไลบรารีโดยไม่มีคำนำหน้า lib

ไม่ใช่ความคิดที่ดีที่จะใช้การตั้งค่าสถานะที่ไม่เป็นมาตรฐานเมื่อมีการตั้งค่าสถานะมาตรฐานที่มีฟังก์ชันเดียวกันบนแพลตฟอร์มของคุณ
David Schwartz


12

หากคุณใช้ cmake คุณสามารถใช้:

add_compile_options(-pthread)

หรือ

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")


6

ผมเชื่อว่าวิธีการที่เหมาะสมในการเพิ่มpthreadในCMakeอยู่กับต่อไปนี้

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

4

ใน Visual Studio 2019 ระบุ-pthreadในหน้าคุณสมบัติของโครงการภายใต้:

Linker -> Command Line -> ตัวเลือกเพิ่มเติม

พิมพ์ใน-pthreadช่องข้อความ


3

คุณต้องใช้ตัวเลือก-lpthreadกับ gcc


7
ข้อมูลผิด! -lpthreadไม่ใช่ "ตัวเลือก" แต่จะระบุไลบรารี

ตัวเลือกบรรทัดคำสั่ง (ตรงกันข้ามกับอาร์กิวเมนต์บรรทัดคำสั่ง)
อเล็กซานเด Stohr

3

คุณต้องการเพียงเพิ่ม "pthread" ในกรรมสิทธิ์ => C / C ++ build => GCC C ++ Linker => ไลบรารี => ส่วนบน "Libraries (-l)" แค่นั้นแหละ


2

ตรวจสอบหน้าคนและคุณจะได้รับ

รวบรวมและเชื่อมโยงกับ -pthread

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);


       Compile and link with -pthread.
       ....

0

ในแอนจูตาให้ไปที่เมนูสร้างจากนั้นกำหนดค่าโครงการ ในกล่อง Configure Options เพิ่ม:

LDFLAGS='-lpthread'

หวังว่ามันจะช่วยใครซักคนด้วย ...


0

บางครั้งถ้าคุณใช้หลายไลบรารีตรวจสอบการอ้างอิงไลบรารี (เช่น -lpthread -lSDL ... <==> ... -lSDL -lpthread)

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