हेडर फ़ाइल और लाइब्रेरी में क्या अंतर है?


80

एक चीज़ जो मुझे कठिन समय समझ में आ रही है वह यह है कि कंपाइलर कैसे काम करता है। मुझे इससे बहुत दिक्कतें हो रही हैं, लेकिन विशेष रूप से मुझे हेडर और लाइब्रेरी मिला हुआ है। अगर कोई चीज़ों को थोड़ा साफ कर सकता है, तो यह बहुत अच्छा होगा।


1
C और C ++ विभिन्न प्रोग्रामिंग लैंग्वेज हैं। और दोनों स्पेसिफिकेशन्स -नोटवेयर सॉफ्टवेयर हैं! - कुछ मानक में (ज्यादातर अंग्रेजी में) लिखे गए हैं, जैसे C15 के लिए n1570 और C ++ के लिए n3337
Basile Starynkevitch

जवाबों:


126

इस तरह दोनों के बारे में सोचें (अस्वीकरण: यह वास्तव में उच्च-स्तरीय उपमा है;) ।।

  • शीर्ष लेख , एक फ़ोन नंबर आप कॉल कर सकते हैं, जबकि ...
  • ... पुस्तकालय वह वास्तविक व्यक्ति है जिसे आप वहां तक ​​पहुंचा सकते हैं!

यह "इंटरफ़ेस" और "कार्यान्वयन" के बीच मूलभूत अंतर है; इंटरफेस (हेडर) आपको बताता है कि कैसे , (जानते हुए भी कि यह कैसे काम करता है) के बिना कुछ कार्यक्षमता कॉल करने के लिए, जबकि कार्यान्वयन (पुस्तकालय) वास्तविक कार्यक्षमता है।

नोट: यह अवधारणा बहुत मौलिक है, क्योंकि यह आपको लचीलेपन की अनुमति देता है: आपके पास अलग-अलग पुस्तकालयों के लिए एक ही हेडर हो सकता है (यानी कार्यक्षमता को उसी तरह से कहा जाता है), और प्रत्येक लाइब्रेरी एक अलग तरीके से कार्यक्षमता को लागू कर सकती है । समान इंटरफ़ेस रखकर, आप अपना कोड बदले बिना पुस्तकालयों को बदल सकते हैं

और: आप कॉलिंग कोड को तोड़ने के बिना पुस्तकालय के कार्यान्वयन को बदल सकते हैं!


2
एह ... मैं अभी भी यहां कुछ नहीं पा रहा हूं। एक के लिए, मुझे यह भी पूरी तरह से यकीन नहीं है कि पुस्तकालय कैसे निकाले जाते हैं, मैंने जितने भी कार्यक्रम संकलित किए हैं, उनकी जरूरत नहीं लगती - वे अभी उत्पन्न नहीं हुए हैं। मुझे लगता है कि पुस्तकालयों को परिभाषित करने की आवश्यकता है? लेकिन इसे अनदेखा करते हुए, मुख्य स्रोत फ़ाइल (s) कहाँ से आती है? मुझे लगा कि हेडर कार्यान्वयन के लिए थे, और मुख्य स्रोत फाइलें इंटरफ़ेस के लिए थीं - लाइब्रेरी केवल निष्पादन योग्य को संकलित करने के लिए आवश्यक थीं ... यदि वे स्थिर हैं, वैसे भी।
ज़ोनारा

2
पुस्तकालयों की प्रगति होती है: आप एक कार्यक्रम लिख सकते हैं, या एक पुस्तकालय लिख सकते हैं।
टॉमटॉम

2
अगर मुझे दूसरों से लाइब्रेरी मिली है। तो मैं Util.libइसे फ़ंक्शन कैसे कह सकता हूं? क्या मुझे इसमें शामिल होने वाली हेडर फाइलें भी यू के लिए प्रासंगिक हैं til.lib?
एलशान

के लिए शीर्ष लेख , मैं अपनी बात लेकिन कार्यान्वयन के बारे में, मैं अभी भी उलझन में हूँ मिल गया। क्योंकि, आम तौर पर, स्रोत फ़ाइल में कार्यान्वयन सही होता है? यदि हमारे पास पहले से ही स्रोत फ़ाइल है तो हमें पुस्तकालय की आवश्यकता क्यों है ? अग्रिम में बहुत बहुत धन्यवाद!
मिलन

57

एक हेडर फ़ाइल का उपयोग आम तौर पर किसी एप्लिकेशन के भीतर इंटरफ़ेस या इंटरफेस के सेट को परिभाषित करने के लिए किया जाता है। एक हेडर फ़ाइल के बारे में सोचें जो तकनीकी कार्यान्वयन विवरण को छोड़ते समय एक कार्यक्रम की बाहरी कार्यक्षमता को दर्शाता है।

उदाहरण के लिए, यदि आप किसी प्रोग्राम का अनुकूलन कर रहे थे, तो आप एल्गोरिथ्म को बेहतर बनाने के लिए स्रोत (.cpp) फ़ाइल को संशोधित करने की सबसे अधिक संभावना करेंगे, लेकिन हेडर फ़ाइल नहीं बदलेगी, क्योंकि बाहरी क्लाइंट अभी भी पैरामीटर के समान सेट का उपयोग करके विधियों को कॉल करते हैं। मान लौटाएं।

C ++ जैसी ऑब्जेक्ट-ओरिएंटेड भाषा में, हेडर फ़ाइल में आमतौर पर निम्नलिखित शामिल होते हैं:

  • वर्ग विवरण और वंशानुक्रम पदानुक्रम
  • वर्ग डेटा सदस्य और प्रकार
  • कक्षा के तरीके

हालांकि हेडर फ़ाइल में कोड को लागू करने से कुछ भी नहीं है, यह आमतौर पर पसंदीदा नहीं है क्योंकि यह कोड में अतिरिक्त युग्मन और निर्भरता को लागू कर सकता है।

कुछ मामलों में (जैसे टेम्पर्ड क्लासेस) तकनीकी कारणों से कार्यान्वयन को हेडर फ़ाइल में परिभाषित किया जाना चाहिए।


एक पुस्तकालय कोड का एक संग्रह है जिसे आप किसी कार्यक्रम या कार्यक्रमों के समूह को उपलब्ध कराना चाहते हैं। इसमें एक विशेष इंटरफ़ेस का कार्यान्वयन या इंटरफेस का सेट शामिल है।

कोड को रोकने और फिर से उपयोग को प्रोत्साहित करने के लिए एक पुस्तकालय में कोड को परिभाषित किया गया है। एक पुस्तकालय स्टेटिकली-लिंक्ड (.लिब) या डायनामिकली-लिंक्ड (.dll) हो सकता है:

  • एक स्टैटिकली-लिंक्ड लाइब्रेरी निर्यात प्रतीकों के एक सेट को परिभाषित करती है (जिसे विधि परिभाषाओं के रूप में सोचा जा सकता है) जो तब निर्माण प्रक्रिया के लिंकिंग चरण के दौरान अंतिम निष्पादन योग्य (.exe) में लिंक किए जाते हैं। इसका तेजी से निष्पादन समय का लाभ है (जैसा कि लाइब्रेरी को गतिशील रूप से लोड करने की आवश्यकता नहीं है), एक बड़े बाइनरी की कीमत पर (क्योंकि निष्पादन योग्य फ़ाइल में विधियों को अनिवार्य रूप से दोहराया गया है)।

  • एक गतिशील रूप से जुड़े पुस्तकालय एक कार्यक्रम के निष्पादन के बजाय एक कार्यक्रम को लिंक करने के दौरान जुड़ा हुआ है। यह उपयोगी है जब कई कार्यक्रमों को समान विधियों को फिर से उपयोग करने की आवश्यकता होती है, और COM जैसे प्रौद्योगिकियों में बड़े पैमाने पर उपयोग किया जाता है।


10

एक बात जो आपको भ्रमित कर सकती है वह यह है कि लाइब्रेरी शब्द C ++ में कई अर्थ हो सकते हैं। एक अर्थ यहाँ अच्छी तरह से चर्चा की गई है:

एक बाइनरी फ़ाइल में फ़ंक्शन का एक लिंक करने योग्य सेट। ये स्टेटिक रूप से जुड़े या गतिशील रूप से जुड़े हो सकते हैं।

लेकिन एक अन्य प्रकार की लाइब्रेरी है: तथाकथित हेडर-ओनली लाइब्रेरी (एसटीएल, टीआर 1 और बूस्ट के कुछ हिस्सों सहित)। ये एक अलग बाइनरी फॉर्म में मौजूद नहीं हैं, इसलिए लाइब्रेरी शब्द किसी विशेष बाइनरी फ़ाइल को संदर्भित नहीं करता है, बल्कि इसमें शामिल हेडर फ़ाइलों का एक सेट है।

उम्मीद है की यह मदद करेगा।


8

एक लाइब्रेरी कोड है, जिसे ऑब्जेक्ट फ़ाइलों के एक समूह में संकलित किया जाता है। ऑब्जेक्ट फ़ाइलों में संकलित मशीन कोड और कोड द्वारा उपयोग किए गए डेटा घोषणाएं शामिल हैं।

एक हेडर फ़ाइल एक पुस्तकालय में इंटरफ़ेस को परिभाषित करता है : यह आपको बताता है कि पुस्तकालय का सही उपयोग कैसे करें। C / C ++ में, एक हेडर फाइल आपको फ़ंक्शन के नामों की एक सूची देता है और उन कार्यों को कैसे कॉल करता है: वे कितने नंबर और प्रकार के पैरामीटर लेते हैं, रिटर्न टाइप, कॉलिंग कन्वेंशन, आदि हेडर फ़ाइलों में बहुत सारे अन्य सामान होते हैं। उन्हें भी, लेकिन अंत में, यह क्या उबालता है, यह लाइब्रेरी कोड को कॉल करने के लिए नियमों का एक समूह है।



2

यदि प्रोग्रामिंग भाषाओं में लाइब्रेरी एक सामान्य पुस्तकालय है, तो लाइब्रेरी में मौजूद कई पुस्तकों की तुलना भाषाओं में कार्यों / विधियों से की जा सकती है। और हेडर फ़ाइलों की तुलना पुस्तक की पंक्ति संख्या के साथ की जा सकती है मान लीजिए कि हैदराबाद में किसी पुस्तकालय में एक पुस्तक है और उस पुस्तकालय में, वह पुस्तक पंक्ति संख्या 24 में मौजूद है ... उसी तरह से पुस्तकालय का पता दिया गया है नाम स्थान std (मानक पुस्तकालय के लिए) और पंक्ति का उपयोग करके हेडर फ़ाइल द्वारा नहीं दिया जाता है, जहाँ एक ही समय की सभी पुस्तकें (इस मामले में विधियाँ) (इनपुट / आउटपुट स्ट्रीम से संबंधित सभी विधियाँ) डाली जाती हैं


2

हेडर आमतौर पर प्रोटोटाइप को शामिल करने के लिए उपयोग किया जाता है। हेडर पूर्व-प्रसंस्करण समय पर विस्तार करते हैं ताकि संकलन समय पर, कोड को प्रासंगिक फ़ंक्शन घोषणाओं / प्रोटोटाइप तक पहुंच मिल सके।

लाइब्रेरी वास्तविक सॉफ्टवेयर है जिसमें फ़ंक्शन प्रोटोटाइप (हेडर में मौजूद) की परिभाषाएं शामिल हैं। लाइब्रेरी का उपयोग लिंक समय पर किया जाता है। लिंक समय पर (पुस्तकालय में मौजूद) परिभाषाएँ हल हो गई हैं।


1

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


1

हेडर फ़ाइल वह है जिसमें किसी फ़ंक्शन की घोषणा लिखी जाती है। लेकिन हेडर फ़ाइल का उपयोग करके हम किसी विशेष फ़ंक्शन का उपयोग कर सकते हैं

जबकि

LIBRARY FILE वह है जिसमें किसी विशेष फ़ंक्शन की परिभाषा लिखी जाती है। MATH.H एक HEADER FILE है जबकि MATH.LIB लाइब्रेरी फ़ाइल है।


1

एक कार्यक्रम में हेडर फ़ाइल और पुस्तकालय का कार्य करना।

एक हेडर फ़ाइल में पुस्तकालयों के लिए लिंक होते हैं (पुस्तकालयों में मानक कार्य और विधियाँ होती हैं), एक संकलक एक प्रीप्रोसेसर के माध्यम से स्रोत कोड में उपयोग किए जाने वाले मानक कार्यों को पहचानता है, जो सभी निर्देशों को हल करता है (निर्देश कार्यक्रम में # संकेत द्वारा पूर्ववर्ती कार्यक्रम की लाइनें हैं जिसमें शामिल हैं) ) कार्यक्रम के वास्तविक संकलन से पहले।

पढ़ने के लिए धन्यवाद!


1

मुझे लगता है कि पुस्तकालय कोड के एक पैकेज के रूप में होता है जो कई बार पुन: उपयोग किया जाता है और उस कोड को पूर्व निर्धारित किया जाता है, इसलिए यह मानक रूप में उपलब्ध होता है ताकि हमें हर प्रोग्राम के लिए उस कोड को लिखना न पड़े जिसे हम विकसित करते हैं। और हेडर फ़ाइल में उस कोड का संदर्भ सरल तरीके से होता है जिसे हम अपने प्रोग्राम में उपयोग करते हैं जैसे कि "cin" और "cout" को पूरी तरह से एक मानक पुस्तकालय में परिभाषित किया गया है, और हेडर फाइल जैसे iostream हेडर फाइल में उस कोड का संदर्भ होता है। इसलिए जब हम अपने कोड को संकलित करते हैं तो हम सिर्फ सिनेमा और कॉट के लिए प्री-कंपाइल हो जाते हैं, और हमें हर बार जब हम इसका उपयोग करते हैं तो कोड और कॉट के लिए कोड लिखना नहीं पड़ता है। या अधिक सरल तरीके से हम कह सकते हैं कि एक पुस्तकालय में सभी कार्यों के लिए कोड होते हैं और उस कोड तक पहुंचने के लिए एक हेडर फ़ाइल होती है।


1

एक पुस्तकालय सामयिक उपयोग के लिए समान वस्तुओं का एक संग्रह है। इसमें आमतौर पर ऑब्जेक्ट या सोर्स कोड फॉर्म, टेम्प्लेट आदि में प्रोग्राम होते हैं।

एक हेडर फ़ाइल पुस्तकालय का स्थान (इंटरफ़ेस) है


0

शास्त्रीय मजाक उड़ाने के लिए, अंतर यह है कि लाइब्रेरी में हेडर फ़ाइल होती है जबकि हेडर फ़ाइल में लाइब्रेरी नहीं होती है।


0

पुस्तकालय मृत ममियों की तरह होते हैं, जो सफेद लंबे धागे में लिपटे होते हैं। वह मर गए हैं। उन्हें जारी करने का केवल एक तरीका है हेडर फाइलें। हेडर फ़ाइलों में उन्हें जीवन में लाने के तरीके होते हैं और उन्हें कई बार जीवन में लाया जा सकता है (कोड का पुन: उपयोग)।


2
यह सादृश्य थोड़ा ... बहुत सार है।
ब्यूस्टर

0

आप इस उदाहरण पर विचार कर सकते हैं करने के लिए समझ Math.hएक हेडर फाइल जो की तरह समारोह कॉल के लिए प्रोटोटाइप भी शामिल है sqrt(), pow(), आदि जबकि libm.lib, libmmd.lib, libmmd.dllगणित पुस्तकालयों में से कुछ हैं। साधारण शब्दों में एक हेडर फाइल विजिटिंग कार्ड की तरह है और लाइब्रेरी एक वास्तविक व्यक्ति की तरह हैं, इसलिए हम वास्तविक व्यक्ति (लाइब्रेरी) तक पहुंचने के लिए विजिटिंग कार्ड (हेडर फाइल) का उपयोग करते हैं।


-4

पुस्तकालयों से कोड केवल हेडर फ़ाइल के लिए आवश्यकतानुसार संग्रहित किया जाएगा। पूरी हेडर फ़ाइल संग्रहीत की जाएगी, जो प्रोसेसर भंडारण क्षेत्र को बचाता है।


StackOverflow में आपका स्वागत है और मदद करने के लिए धन्यवाद। यदि आप स्पष्टता और पठनीयता के लिए इसे पुनःप्रकाशित करते हैं तो आपका उत्तर मददगार हो सकता है। स्वरूपण के लिए कुछ मार्कडाउन का उपयोग करना सहायक हो सकता है। हेडर और लाइब्रेरी के बीच का अंतर अन्य, अधिक महत्वपूर्ण पहलुओं से है कि उनमें से कितना संग्रहीत है।
युनानोश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.