2013-02-27 191 views
5

मैं फेडोरा 17 (जीसीसी के साथ) पर ग्रहण का उपयोग कर रहा हूं और मेरे पास pthread_create() पर एक अनिर्धारित संदर्भ है, भले ही pthread.h शामिल है और यदि मैंने gcc build कमांड लाइन पर -lpthread किया है। ..pthread लाइब्रेरी अपरिभाषित संदर्भ

यहाँ मेरी कोड, अगर है

void* repair() 
{ 
    int var; 
    for (var = 0; var < NB_ITER ; var += 2) 
    { 
     printf("PAIR : %d\n", var); 
    } 

return NULL; 
} // pair 

void exo03() 
{ 
    pthread_t id1; 
    pthread_create(&id1, NULL, &repair, NULL); 
} 

की मदद :)

+1

शायद आप शायद pthread लाइब्रेरी से लिंक करने के लिए भूल गए हैं। अंतिम संकलन के रूप में अपने संकलन आदेश में '-lpthread' जोड़ें। –

+0

क्या आप संकलक कमांड + त्रुटियों का एक पूर्ण उदाहरण और सटीक नोट प्रदान कर सकते हैं? – simonc

उत्तर

8

linux पर सहयोग के लिए धन्यवाद, FreeBSD (और कुछ अन्य * nix जायके) आप संकलक विकल्प का उपयोग करना चाहिए -pthread और एक pthread लाइब्रेरी से जोड़ने की कोशिश नहीं कर रहा है।

eclipse के लिए:

ग्रहण जीसीसी संकलन में -pthread तर्क डाल करने के लिए कॉन्फ़िगर नहीं है। इस को हल करने के लिए, मेनू:

परियोजना -> गुण

C/C++ का निर्माण -> जीसीसी सी संकलक -> विविध

"-pthread" तर्क की शुरुआत में जोड़ें " अन्य झंडे: pthread "

इसके अलावा करने के लिए जाने -> सेटिंग्स -

C/C++ का निर्माण -> जीसीसी सी लिंकर> पुस्तकालय

और शामिल हैं" "पुस्तकालय अन्य पुस्तकालयों में। प्रोजेक्ट पर लागू करें और पुनर्निर्माण पर क्लिक करें। Pthreads अब काम करना चाहिए।

man gcc से:

-pthread: pthreads पुस्तकालय के साथ multithreading के लिए समर्थन जोड़ता है। यह विकल्प प्रीप्रोसेसर और लिंकर दोनों के लिए झंडे सेट करता है।

मैंने पाया एक explanation here:

जीसीसी में, -pthread (उर्फ -pthreads) विकल्प का प्रबंधन करता है दोनों संकलक पूर्वप्रक्रमक/और/लिंकर Posix धागे के साथ संकलन सक्षम करने के लिए। पूर्वप्रक्रमक परिभाषित करेगा/सक्षम/का उपयोग Posix धागे कुछ मैक्रो के संस्करणों (या Posix धागे तर्क सक्षम करने के लिए सशर्त संकलन प्रदर्शन), और लिंकर libpthread के खिलाफ उसके एवज में वस्तु लिंक विशेष रूप से होगा

हालांकि, -lpthread बस लिंकर को libpthread लाइब्रेरी के विरुद्ध बाहरी संदर्भों को हल करने का प्रयास करने के लिए बताता है, उसी तरह कि -lm लिंकर को libm लाइब्रेरी के विरुद्ध किसी भी बाहरी संदर्भों को हल करने का प्रयास करने के लिए कहता है। -lpthread के लिए, आपका कोड में libpthread के बाहरी संदर्भ नहीं हो सकते हैं, भले ही आपने Posix थ्रेड कोड लिखा हो, क्योंकि महत्वपूर्ण मैक्रोज़ को चालू नहीं किया गया है।

+0

libpthread के खिलाफ क्यों लिंक नहीं है? –

+0

@ bash.d: क्योंकि '-pthread' विकल्प के बिना, compiller और linker सही pthread लाइब्रेरी को खोजने में विफल रहेगा :) –

+0

ठीक है, धन्यवाद, मैं इसके बारे में भूल गया था! –

4

क्या आपने libpthread से जुड़ा हुआ है?

$> gcc ... -lpthread