लिनक्स में pthread_create का अपरिभाषित संदर्भ


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
1

उस उदाहरण से थोड़ा ऊपर, आपको सही कंपाइलर कमांड्स की एक तालिका दिखाई देगी, चाहे वह जीसीसी, आईबीएम आदि हो, 'एंप्लॉयड रशियन' सही है।
जोनाथन रेनहार्ट

8
क्या आप मेरे उत्तर को अनचाहा कर सकते हैं, ताकि मैं इसे हटा सकूं (और जो वास्तव में सही है, जो सबसे अधिक मतदाता है, उसे चिह्नित करें)?
पावेल मिनाएव

3
-lpthreadसंकलन के दौरान आवश्यक है
कैसे चेन

5
समाधानLDFLAGS= -pthread -lpthread
dsnk

जवाबों:


696

इस प्रश्न के दोनों उत्तर अब तक गलत हैं
लिनक्स के लिए सही कमांड है:

gcc -pthread -o term term.c

सामान्य तौर पर, पुस्तकालयों को कमांड लाइन पर स्रोतों और वस्तुओं का पालन करना चाहिए, और -lpthreadयह "विकल्प" नहीं है, यह एक पुस्तकालय विनिर्देश है। केवल libpthread.aस्थापित सिस्टम के साथ ,

gcc -lpthread ...

लिंक करने में विफल रहेगा।


2
+1 इस समाधान ने काम किया ... दूसरे ने नहीं किया। इसके अलावा, सुझाव है कि 'पुस्तकालयों को स्रोतों और वस्तुओं का पालन करना चाहिए' महान सलाह है - एक उद्धरण या आगे की व्याख्या महान होगी।
शाल्सपैप

7
: @sholsapp यहाँ विवरण है webpages.charter.net/ppluzhnikov/linker.html
कार्यरत रूसी

यह तब भी मेरे लिए गलत था जब तक मैं अपने आदेश के बहुत अंत में डाल दिया। gcc term.c -lpthread
कॉर्नस्मिथ

मैं सिर्फ उबंटू 14.04 पर स्नॉर्टसम को संकलित करने वाले मुद्दे में भाग गया, जिसमें वास्तव में libpthread.a और libpthread.so दोनों हैं। मैं हो रहा था undefined reference to 'pthread_cancel'और undefined reference to 'pthread_create'त्रुटियों। मैं इस एसओ पोस्ट के पार आया और सोचा कि मैं रूसी के उत्तर को आज़माऊंगा। मैं खोल दिया makesnortsam.shVI में और कमांड भाग गया :%s/lpthread/pthread/gइतना है कि यह प्रयोग करेंगे pthread साथ lpthread को बदलने के लिए -pthreadकरने के बजाय -lpthreadजब संकलन। मैं तब स्नोट्सम का संकलन करने में सक्षम था। धन्यवाद नियोजित रूसी!
dcarrith

5
CODEBLOCKS का उपयोग करने वाले किसी भी व्यक्ति के लिए: -pthreadप्रोजेक्ट बिल्ड विकल्प में जोड़ें -> लिंकर सेटिंग्स -> अन्य लिंकर विकल्प।
user3728501

39

ग्रहण में

गुण-> c / c ++ बिल्ड-> सेटिंग-> GCC C ++ लिंकर-> शीर्ष भाग में पुस्तकालयों में "अंतिम तिथि" जोड़ें


एक ही टिप कोड :: परियोजना में applyes (और मुझे लगता है कि दूसरों को भी IDE)
Fil

19

लिनक्स टर्मिनल से चलकर, मेरे लिए जो काम किया गया था, वह निम्नलिखित कमांड का उपयोग करके संकलित किया गया था (मान लीजिए कि जिस फ़ाइल को मैं संकलित करना चाहता हूं, उसे टेस्ट कोड कहा जाता है):

gcc -o test test.c -pthread

आशा है कि यह किसी की मदद करता है!


19

लिनक्स के लिए सही कमांड है:

gcc -o term term.c -lpthread
  1. आपको कंपाइल कमांड के ठीक बाद -Lpreadread करना होगा, यह कमांड कंपाइलर को preadread.h लाइब्रेरी के साथ प्रोग्राम निष्पादित करने के लिए बताएगा।
  2. पुस्तकालय फ़ाइल के साथ gl -l लिंक। लिक उप-लायब्रेरी के नाम के साथ बिना उपसर्ग के।

एक गैर-मानक ध्वज का उपयोग करना एक अच्छा विचार नहीं है जब एक मानक ध्वज मौजूद होता है जो आपके प्लेटफ़ॉर्म पर समान कार्य करता है।
डेविड श्वार्ट्ज

16

संक्षेप में, यह संकलन कोड के लिए उपयोग किए गए संकलन आदेशों के कई उदाहरण देता है, यदि आप नीचे दिए गए ट्यूटोरियल को पढ़ना जारी रखते हैं:

https://computing.llnl.gov/tutorials/pthreads/#Compiling

यहां छवि विवरण दर्ज करें


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

दृश्य स्टूडियो 2019 -pthreadमें परियोजना के लिए संपत्ति पृष्ठों में निर्दिष्ट करें :

लिंकर -> कमांड लाइन -> अतिरिक्त विकल्प

-pthreadटेक्स्टबॉक्स में टाइप करें ।


3

आपको -lpthreadजीसीसी के साथ विकल्प का उपयोग करने की आवश्यकता है ।


7
गलत जानकारी! -lpthreadएक "विकल्प" नहीं है, यह एक पुस्तकालय निर्दिष्ट करता है।

एक कमांड लाइन विकल्प (एक कमांड लाइन तर्क के विपरीत)
अलेक्जेंडर स्टोह्र

3

आपको केवल प्रोप्रेटीज़ में "pthread" जोड़ें => C / C ++ build => GCC C ++ Linker => लाइब्रेरीज़ => शीर्ष भाग "लाइब्रेरीज़ (-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

अंजुता में, बिल्ड मेनू पर जाएं, फिर प्रोजेक्ट कॉन्फ़िगर करें। कॉन्फ़िगर विकल्प बॉक्स में, जोड़ें:

LDFLAGS='-lpthread'

आशा है कि यह भी किसी की मदद करेंगे ...


0

कभी-कभी, यदि आप कई पुस्तकालय का उपयोग करते हैं, तो पुस्तकालय निर्भरता की जांच करें। (उदाहरण -lpreadread -lSDL ... <==> ... -lSDL -lpreadread)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.