c++ - रखरख - हिंदी में छात्रों के लिए पुस्तकालय नियम




गतिशील बनाम स्थैतिक पुस्तकालयों का उपयोग कब करें (12)

एक स्थिर पुस्तकालय बनाना

$$:~/static [32]> cat foo.c
#include<stdio.h>
void foo()
{
printf("\nhello world\n");
}
$$:~/static [33]> cat foo.h
#ifndef _H_FOO_H
#define _H_FOO_H

void foo();

#endif
$$:~/static [34]> cat foo2.c
#include<stdio.h>
void foo2()
{
printf("\nworld\n");
}
$$:~/static [35]> cat foo2.h
#ifndef _H_FOO2_H
#define _H_FOO2_H

void foo2();

#endif
$$:~/static [36]> cat hello.c
#include<foo.h>
#include<foo2.h>
void main()
{
foo();
foo2();
}
$$:~/static [37]> cat makefile
hello: hello.o libtest.a
        cc -o hello hello.o -L. -ltest
hello.o: hello.c
        cc -c hello.c -I`pwd`
libtest.a:foo.o foo2.o
        ar cr libtest.a foo.o foo2.o
foo.o:foo.c
        cc -c foo.c
foo2.o:foo.c
        cc -c foo2.c
clean:
        rm -f foo.o foo2.o libtest.a hello.o

$$:~/static [38]>

गतिशील पुस्तकालय बनाना

$$:~/dynamic [44]> cat foo.c
#include<stdio.h>
void foo()
{
printf("\nhello world\n");
}
$$:~/dynamic [45]> cat foo.h
#ifndef _H_FOO_H
#define _H_FOO_H

void foo();

#endif
$$:~/dynamic [46]> cat foo2.c
#include<stdio.h>
void foo2()
{
printf("\nworld\n");
}
$$:~/dynamic [47]> cat foo2.h
#ifndef _H_FOO2_H
#define _H_FOO2_H

void foo2();

#endif
$$:~/dynamic [48]> cat hello.c
#include<foo.h>
#include<foo2.h>
void main()
{
foo();
foo2();
}
$$:~/dynamic [49]> cat makefile
hello:hello.o libtest.sl
        cc -o hello hello.o -L`pwd` -ltest
hello.o:
        cc -c -b hello.c -I`pwd`
libtest.sl:foo.o foo2.o
        cc -G -b -o libtest.sl foo.o foo2.o
foo.o:foo.c
        cc -c -b foo.c
foo2.o:foo.c
        cc -c -b foo2.c
clean:
        rm -f libtest.sl foo.o foo

2.o hello.o
$$:~/dynamic [50]>

सी ++ में कक्षा पुस्तकालय बनाते समय, आप गतिशील (.dll) और स्थिर (.lib) पुस्तकालयों के बीच चयन कर सकते हैं। उनके बीच क्या अंतर है और इसका उपयोग करने के लिए उचित कब है?


" साझा पुस्तकालयों को कैसे लिखें " पर Ulrich Drepper का पेपर भी एक अच्छा संसाधन है जो बताता है कि साझा पुस्तकालयों का लाभ कैसे लेना है, या जिसे वह "गतिशील साझा ऑब्जेक्ट्स" (डीएसओ) के रूप में संदर्भित करता है। यह ELF बाइनरी प्रारूप में साझा पुस्तकालयों पर अधिक केंद्रित है, लेकिन कुछ चर्चाएं विंडोज डीएलएल के लिए भी उपयुक्त हैं।


आपको समय, संस्करण, स्थिरता, संगतता इत्यादि के साथ बदलावों के बारे में सावधानी से सोचना चाहिए।

यदि साझा किए गए कोड का उपयोग करने वाले दो ऐप्स हैं, तो क्या आप उन ऐप्स को एक साथ बदलने के लिए बाध्य करना चाहते हैं, अगर उन्हें एक दूसरे के साथ संगत होने की आवश्यकता हो? फिर डीएलएल का प्रयोग करें। सभी एक्सई एक ही कोड का उपयोग करेंगे।

या आप उन्हें एक-दूसरे से अलग करना चाहते हैं, ताकि आप एक को बदल सकें और आत्मविश्वास रखें कि आपने दूसरे को तोड़ा नहीं है। फिर स्थिर lib का उपयोग करें।

डीएलएल नरक तब होता है जब आपको शायद एक स्थिर lib का उपयोग करना चाहिए, लेकिन आप इसके बजाय एक डीएलएल इस्तेमाल करते थे, और सभी exes इसके साथ comaptible नहीं हैं।


इस विषय की उत्कृष्ट चर्चा के लिए सूर्य से इस लेख का एक पठन है।

यह इंटरपोज़िंग पुस्तकालयों को सम्मिलित करने में सक्षम होने सहित सभी लाभों में जाता है। इंटरपोज़िंग पर अधिक जानकारी यहां इस आलेख में मिल सकती है


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

जब आप निष्पादन योग्य को फिर से लिंक किए बिना लाइब्रेरी द्वारा प्रदान की गई कार्यक्षमता को बदलने में सक्षम होना चाहते हैं तो आप एक डीएलएल का उपयोग करेंगे (केवल डीएलएल फ़ाइल को प्रतिस्थापित करें, निष्पादन योग्य फ़ाइल को प्रतिस्थापित किए बिना)।

जब भी आपके पास गतिशील लाइब्रेरी का उपयोग करने का कोई कारण नहीं है, तो आप एक स्थिर लाइब्रेरी का उपयोग करेंगे।


एक स्थिर पुस्तकालय ग्राहक में संकलित हो जाता है। ए। लिब का उपयोग संकलन समय पर किया जाता है और लाइब्रेरी की सामग्री खपत निष्पादन योग्य का हिस्सा बन जाती है।

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


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

यदि आपके पास एक लाइब्रेरी है जो कोडबेज के बाकी हिस्सों से अलग है (उदाहरण के लिए एक थर्ड पार्टी लाइब्रेरी) तो इसे एक डीएलएल बनाने पर विचार करें। यदि लाइब्रेरी एलजीपीएल है तो आपको लाइसेंस शर्तों के कारण किसी भी तरह का डीएलएल उपयोग करने की आवश्यकता हो सकती है।


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


यदि लाइब्रेरी स्थिर है, तो लिंक समय पर कोड आपके निष्पादन योग्य के साथ जुड़ा हुआ है। इससे आपका निष्पादन योग्य बड़ा हो जाता है (यदि आप गतिशील मार्ग पर जाते हैं)।

यदि पुस्तकालय गतिशील है तो आवश्यक विधियों के लिंक समय संदर्भों पर आपके निष्पादन योग्य में बनाया गया है। इसका मतलब है कि आपको अपने निष्पादन योग्य और गतिशील पुस्तकालय को शिप करना होगा। आपको यह भी विचार करना चाहिए कि पुस्तकालय में कोड तक साझा पहुंच सुरक्षित है, अन्य सामानों के बीच पसंदीदा लोड पता है।

यदि आप स्थैतिक पुस्तकालय के साथ रह सकते हैं, तो स्थिर पुस्तकालय के साथ जाएं।


सी ++ प्रोग्राम दो चरणों में बनाए जाते हैं

  1. संकलन - वस्तु कोड उत्पन्न करता है (.obj)
  2. लिंकिंग - निष्पादन योग्य कोड (.exe या .dll) उत्पन्न करता है

स्टेटिक लाइब्रेरी (.lib) सिर्फ .obj फ़ाइलों का एक बंडल है और इसलिए एक पूर्ण प्रोग्राम नहीं है। इस कार्यक्रम के निर्माण के दूसरे (लिंकिंग) चरण में नहीं आया है। दूसरी ओर, डीएलएस exe की तरह हैं और इसलिए पूर्ण कार्यक्रम हैं।

यदि आप एक स्थिर लाइब्रेरी बनाते हैं, तो यह अभी तक लिंक नहीं है और इसलिए आपकी स्थिर लाइब्रेरी के उपभोक्ताओं को आपके द्वारा उपयोग किए जाने वाले उसी कंपाइलर का उपयोग करना होगा (यदि आपने g ++ का उपयोग किया है, तो उन्हें g ++ का उपयोग करना होगा)।

यदि इसके बजाय आपने एक डीएल बनाया है (और इसे correctly बनाया correctly ), तो आपने एक पूरा प्रोग्राम बनाया है जो सभी उपभोक्ता उपयोग कर सकते हैं, भले ही वे किस कंपाइलर का उपयोग कर रहे हों। हालांकि, कई प्रतिबंध हैं, एक डीएलएल से निर्यात करने पर, यदि क्रॉस कंपाइलर संगतता वांछित है।


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


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

उदाहरण के लिए, यदि आप एलजीपीएल लाइसेंस प्राप्त कोड का उपयोग कर रहे हैं और आप एलजीपीएल लाइब्रेरी के खिलाफ स्थिर रूप से लिंक करते हैं (और इस प्रकार एक बड़ी बाइनरी बनाते हैं), तो आपका कोड स्वचालित रूप से ओपन सोर्स ( स्वतंत्रता के रूप में मुक्त) एलजीपीएल कोड बन जाता है। यदि आप किसी साझा ऑब्जेक्ट्स के विरुद्ध लिंक करते हैं, तो आपको केवल एलजीपीएल लाइब्रेरी में किए गए सुधार / बग फिक्स को एलजीपीएल की आवश्यकता होती है।

यह एक और अधिक महत्वपूर्ण मुद्दा बन जाता है यदि आप निर्णय ले रहे हैं कि उदाहरण के लिए आपको मोबाइल एप्लिकेशन कैसे संकलित करें (एंड्रॉइड में आपके पास स्थिर बनाम डायनामिक का विकल्प है, आईओएस में आप नहीं करते - यह हमेशा स्थिर होता है)।





dynamic-linking