2012-02-17 31 views
8

का लिप्थ्रेड विकल्प जैसा कि मुझे पता है, अगर मैं लिनक्स पर्यावरण में पाथ्रेड लाइब्रेरी का उपयोग करना चाहता हूं तो मुझे pthread.h शामिल करना होगा और -lpthread विकल्प के साथ स्रोत कोड संकलित करना होगा। लेकिन मुझे समझ में नहीं आता कि मुझे -lpthread विकल्प के साथ क्यों संकलित करना चाहिए। मुझे लगता है कि विकल्प अनावश्यक है ... क्योंकि मैंने पहले से ही pthread.h हेडर फ़ाइल को शामिल करने की घोषणा की है ताकि gcc pthread लाइब्रेरी लिंक हो। Gcc pthread लाइब्रेरी फ़ाइल को स्वचालित रूप से # शामिल करके क्यों लिंक नहीं करता है?-जीसीसी

अग्रिम धन्यवाद।

+3

संबंधित: http://stackoverflow.com/questions/2127797/gcc-significance-of-pthread-flag-when-compiling, आपको भी '-pthread' का उपयोग करना चाहिए। – Mat

उत्तर

17

खैर जोड़ने और संकलन दो अलग-अलग चरण होते हैं।

आप शीर्ष लेख pthread.h ताकि संकलक डेटा प्रकार & प्रतीक नाम है, जो आपको अपनी स्रोत फ़ाइल में उपयोग करते हैं लेकिन परिभाषित कर रहे हैं/pthread पुस्तकालय हेडर फाइल में घोषित समझता शामिल हैं।

आप -lpthread का उपयोग करके pthread लाइबेरे से लिंक करते हैं ताकि लिंकर लिंकिंग चरण के दौरान वास्तव में उन प्रतीकों को पाथ्रेड लाइब्रेरी में ढूंढ सकें।

+1

तो, जब हम strcpy या printf का उपयोग करते हैं तो हमें लिंक करने के लिए स्पष्ट रूप से कुछ लाइब्रेरी क्यों शामिल नहीं करना है? ऐसा इसलिए है क्योंकि ये सभी सी मानक पुस्तकालय में हैं और इसे डिफ़ॉल्ट रूप से शामिल किया गया है, और उस पुस्तकालय के बाहर कुछ भी स्पष्ट रूप से लिंक होना चाहिए? –

+0

@master_latch: हाँ सटीक कारण है। –

3

क्योंकि जीसीसी हैडर शामिल किए जाने से चालू होने वाले पुस्तकालयों के auto-linking (के रूप में MSVC का विरोध किया, या तो मुझे बताया गया है) नहीं करता है।

+1

एमएसवीसी में लाइब्रेरी में लिंक करने के लिए वास्तव में '# प्रगमा' विकल्प है, लेकिन इसका बहुत ही कम उपयोग किया जाता है (और आमतौर पर खराब अभ्यास माना जाता है)। –

2

हेडर फ़ाइल सिर्फ यह बताती है कि pthread फ़ंक्शन क्या हैं और उन्हें कैसे कहा जाना चाहिए। -lpthread पुस्तकालय के लिए लिंक, वास्तविक कार्यों को शामिल करते हैं।

कंपाइलर को पता नहीं है कि आप pthread.h में फ़ंक्शंस को कैसे हल करने जा रहे हैं। आप एक स्थिर लाइब्रेरी का उपयोग करना चाहेंगे, जो सिस्टम द्वारा प्रदान किया गया है, कुछ संगत कार्यान्वयन - हेक, आप उन्हें स्वयं को किसी अन्य स्रोत फ़ाइल में लागू कर सकते हैं। यह लिंकर पर निर्भर है, और संकलक से संबंधित नहीं है।

2

आपके कोड में #include <pthread.h> होने से लाइब्रेरी में लिंक नहीं होता है; इसमें केवल संकलन के लिए हेडर शामिल है। इससे संकलक विभिन्न संरचनाओं, कार्य घोषणाओं आदि को देखने की अनुमति देता है। -lpthread होने से वास्तव में लिंकर द्वारा लिंकिंग का कारण बनता है। तो इसमें शामिल संकलक बताता है कि क्या उपलब्ध है, और -lpthread वास्तव में प्रोग्राम को रनटाइम पर लाइब्रेरी के भीतर फ़ंक्शंस को कॉल करने की अनुमति देता है।

1

हेडर फाइलों को शामिल करके आप संकलक को बताते हैं कि वह कौन सा काम देख रहा है। लेकिन यदि ये कार्य बाहरी पुस्तकालय में हैं, जैसे pthread फ़ंक्शंस, तो आपको लिंक इस लाइब्रेरी को अपने प्रोग्राम में रखना होगा ताकि यह वास्तव में उन कार्यों तक पहुंच सके। यही -lpthread कर रहा है।

1

Pthread.h हेडर फाइल POSIX धागे कार्यक्रम में शामिल है, लेकिन जब संकलन है क्योंकि यह यह pthread नोट के पुस्तकालय के साथ लिंक आप -lpthread की जरूरत है:-lpthread-lpcap सभी जीसीसी संकलक के साथ स्विच कि विशेष रूप से लिंक कर सकते हैं कर रहे हैं हमारे स्रोत कोड में लाइब्रेरी। (lpthread का अर्थ है "लिंक pthread" लाइब्रेरी)