2012-04-18 6 views
5

के तहत एक साधारण पथ्रेड कोड को संकलित करने में लिंकर त्रुटियां मैं एक सी ++ स्रोत फ़ाइल test.cpp संकलित करने की कोशिश कर रहा हूं, जिसमें एक बहुत ही सरल कोड है जो pthread_create() को प्रदर्शित करता है; pthread_cond_signal/pthread_cond_wait() कार्यक्षमता।मिंगड

मैंने विंडोज एक्सपी पर मिंगव/Ansys स्थापित किया है जहां मैं काम कर रहा हूं। Mingw प्रॉम्प्ट में मुझे क्या करना:

g++ -IC:/MinGW/include/ -lpthread test.cpp 
//-IC:/MinGW/include to get pthread.h 
//-LC:/MinGW/bin to get pthreadGC2.dll 

सीपीपी के रूप में pthread.h में शामिल हैं:

#include <pthread.h> 

लेकिन यह मुझे सभी pthread पुस्तकालय कार्यों के लिए कई लिंकर अपरिभाषित संदर्भ त्रुटियों दे दी है।

मैं यहां क्या गलत कर रहा हूं। क्या विंडोज़ पर मिंगडब्ल्यू पर्यावरण पर एक पर्थ्रेड कोड बनाना संभव है या नहीं?

इस त्रुटियों को कैसे हल करें?

C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x23): undefined reference to `_imp__pthread_mutex_lock' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x67): undefined reference to `_imp__pthread_cond_signal' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x75): undefined reference to `_imp__pthread_mutex_unlock' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x98): undefined reference to `_imp__pthread_exit' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0xbc): undefined reference to `_imp__pthread_mutex_lock' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0xe8): undefined reference to `_imp__pthread_cond_wait' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x10f): undefined reference to `_imp__pthread_mutex_unlock' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x135): undefined reference to `_imp__pthread_exit' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x153): undefined reference to `_imp__pthread_attr_init' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x169): undefined reference to `_imp__pthread_mutex_init' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x17f): undefined reference to `_imp__pthread_attr_setdetachstate' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x195): undefined reference to `_imp__pthread_cond_init' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x1bc): undefined reference to `_imp__pthread_create' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x1e3): undefined reference to `_imp__pthread_create' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x201): undefined reference to `_imp__pthread_join' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x21f): undefined reference to `_imp__pthread_join' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x239): undefined reference to `_imp__pthread_mutex_destroy' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x247): undefined reference to `_imp__pthread_cond_destroy' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x255): undefined reference to `_imp__pthread_attr_destroy' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x263): undefined reference to `_imp__pthread_exit' 
collect2: ld returned 1 exit status 
+0

मैंने उपयोग किए गए मिनजीडब्ल्यू वितरण को एक पर्थ्रेड लाइब्रेरी के साथ नहीं आया है। क्या आपके पास वास्तव में एक है (एक http://sourceware.org/pthreads-win32/ से उपलब्ध है)? –

+0

@ माइकल बुर: मैंने स्पष्ट रूप से मिंगडब्ल्यू पर पथ्रेड स्थापित नहीं किया था। लेकिन चूंकि मैंने trhe mingw बाइनरी फ़ोल्डर में pthreadGC2.dll देखा, इसलिए मैंने इसे समर्थित pthread कॉल मान लिया। नहीं? – goldenmean

+0

pthread-Win32 के लिंक के लिए धन्यवाद। बस एक क्वेरी फिर क्या है pthread.h हेडर और pthreadgc2.dll MinGW में हैं? – goldenmean

उत्तर

14

फ़ाइलों को आप पुस्तकालय पर निर्भर के बाद जीसीसी/जी ++ कमांड लाइन पर पुस्तकालय निर्दिष्ट करने के लिए की जरूरत है। तो कोशिश:

g++ -IC:/MinGW/include/ test.cpp -lpthread 

मैं अपने आप को लात मारी जब मैं इस सवाल का जवाब (यह पुस्तकालयों और जीसीसी के लिए एक पूछे जाने वाले प्रश्न की तरह) पर ठोकर खाई। अधिकांश जीसीसी विकल्पों के लिए कोई फर्क नहीं पड़ता, लेकिन पुस्तकालयों के लिए यह महत्वपूर्ण है।

यदि आपके पेंग्रेड लाइब्रेरी आपके मिनजीडब्ल्यू वितरण के साथ आया है तो आपको लाइब्रेरी पथ निर्दिष्ट नहीं करना चाहिए (जैसा कि ऐसा लगता है कि यह आपके लिए मामला है)। साथ ही, याद रखें कि उपरोक्त कमांड लाइन a.exe निष्पादन योग्य उत्पन्न करेगी; इससे बचने के लिए -o test.exe पास करें।

+0

ओह वह मीठा है। -प्पट्रेड का ऑर्डर चेंज काम किया। आपके सहायक पॉइंटर्स और उत्तरों के लिए धन्यवाद। मुझे स्टैक ओवरफ्लो पसंद है! मंच है कि; मेरे कोड में नहीं! – goldenmean

+0

लगभग एक महीने बाद किसी अन्य उपयोगकर्ता से धन्यवाद! – The111

+0

दो साल बाद किसी अन्य उपयोगकर्ता से धन्यवाद! –