c++ - MinGW के साथ स्टेटिक और गतिशील/साझा लिंकिंग



gcc static-linking (1)

मैं अपनी समस्या को समझाने के लिए एक सरल लिंकिंग उपयोग से शुरू करना चाहता हूं। आइए मान लें कि एक लाइब्रेरी z जिसे साझा लाइब्रेरी libz.dll (D: /libs/z/shared/libz.dll) या स्थिर लाइब्रेरी libz.a (डी: / libs / z / static / libz) में संकलित किया जा सकता है ।ए)।

मैं इसके खिलाफ लिंक करना चाहता हूं, तो मैं यह करता हूं:

gcc -o main.exe main.o -LD:/libs/z/static -lz

इस दस्तावेज़ीकरण के अनुसार, जीसीसी libz.a की खोज करेगा, जो है

संग्रह फाइलें जिनके सदस्य ऑब्जेक्ट फाइलें हैं

मैं निम्नलिखित भी कर सकता हूं:

gcc -o main.exe main.o -LD:/libs/z/shared -lz

उपर्युक्त दस्तावेज में इसका उल्लेख नहीं किया गया है -l ध्वज lib<name>.so लिए खोज करेगा।

क्या होगा यदि मैं libz.a और libz.dll एक ही निर्देशिका में होगा? पुस्तकालय कैसे एक कार्यक्रम से जुड़ा होगा? मुझे झंडे की आवश्यकता क्यों है -Wl,-Bstatic और -Wl,-Bdynamic अगर -Wl,-Bdynamic दोनों साझा और स्थैतिक पुस्तकालयों के लिए खोज करता है?

क्यों कुछ डेवलपर्स एक ही मॉड्यूल के लिए .dll फ़ाइलों के साथ .a फ़ाइलों को प्रदान करते हैं, यदि मैं साझा लाइब्रेरी वितरण संकलित करता हूं?

उदाहरण के लिए, क्यूटी lib निर्देशिका में .a फ़ाइलों के साथ bin निर्देशिका में .dll फ़ाइलें प्रदान करता है। क्या यह वही पुस्तकालय है, लेकिन क्रमशः साझा और स्थैतिक की तरह बनाया गया है? या .a फ़ाइलें किसी प्रकार की डमी लाइब्रेरी हैं जो साझा पुस्तकालयों से जुड़ती हैं, जहां असली लाइब्रेरी कार्यान्वयन हैं?

विंडोज़ पर ओपनजीएल लाइब्रेरी का एक और उदाहरण है। क्यों प्रत्येक कंपाइलर को MingW में libopengl32.a जैसे स्थिर OpenGL lib प्रदान करना होगा?

.Dll.a और .la एक्सटेंशन के साथ फ़ाइलों के लिए क्या उपयोग किया जाता है?

पीएस यहां बहुत सारे प्रश्न हैं, लेकिन मुझे लगता है कि प्रत्येक व्यक्ति पिछले एक पर निर्भर करता है और उन्हें कई प्रश्नों में विभाजित करने की आवश्यकता नहीं होती है।


कृपया, एलडी और WIN32 (cygwin / mingw) पर एक नज़र डालें। विशेष रूप से, एलडी के विंडोज बंदरगाहों पर -l ध्वज के व्यवहार पर अधिक जानकारी के लिए एक डीएलएल अनुभाग से सीधे लिंक करना । निकालें:

उदाहरण के लिए, जब ld को तर्क-lxxx के साथ बुलाया जाता है, तो यह अपने खोज पथ की पहली निर्देशिका में खोजने का प्रयास करेगा,

libxxx.dll.a
xxx.dll.a
libxxx.a
cygxxx.dll (*)
libxxx.dll
xxx.dll

खोज पथ में अगली निर्देशिका पर जाने से पहले।

(*) असल में, यह cygxxx.dll नहीं है लेकिन वास्तव में <prefix>xxx.dll , जहां <prefix> ld विकल्प -dll-search-prefix=<prefix> द्वारा सेट किया गया है। -dll-search-prefix=cyg के मामले में, मानक जीसीसी स्पेक फ़ाइल में -dll-search-prefix=cyg , इसलिए असल में हम वास्तव में cygxxx.dll खोज करते हैं।

नोट: यदि आपने कभी भी MinGW के साथ बूस्ट बनाया है, तो आपको शायद याद होगा कि बूस्ट पुस्तकालयों का नामकरण उपर्युक्त लिंक में वर्णित पैटर्न का पालन करता है।

अतीत में *.dll से सीधे लिंक के साथ MinGW में समस्याएं थीं, इसलिए इसे *.dll से निर्यात किए गए प्रतीकों के साथ एक स्थिर लाइब्रेरी lib*.a बनाने और इसके बजाय इसके लिंक के लिए सलाह दी गई थी। इस मिनजीडब्ल्यू विकी पेज का लिंक अब मर चुका है, इसलिए मुझे लगता है कि *.dll खिलाफ सीधे लिंक करना ठीक होना चाहिए। इसके अलावा, मैंने इसे नवीनतम MinGW-w64 वितरण के साथ कई बार किया है, और अभी तक कोई समस्या नहीं है।

आपको लिंक झंडे की आवश्यकता है -Wl,-Bstatic और -Wl,-Bdynamic क्योंकि कभी-कभी आप स्थैतिक लिंकिंग को मजबूर करना चाहते हैं, उदाहरण के लिए, जब एक ही नाम के साथ गतिशील लाइब्रेरी खोज पथ में भी मौजूद होती है:

gcc object1.o object2.o -lMyLib2 -Wl,-Bstatic -lMyLib1 -Wl,-Bdynamic -o output

उपर्युक्त स्निपेट गारंटी देता है कि -l ध्वज की डिफ़ॉल्ट लिंकिंग प्राथमिकता MyLib1 लिए ओवरराइड की MyLib1 , यानी यदि MyLib1.dll खोज पथ में मौजूद है, तो भी एलडी libMyLib1.a को लिंक करने के लिए चुन libMyLib1.a । ध्यान दें कि MyLib2 एलडी के लिए फिर से गतिशील संस्करण पसंद करेंगे।

नोट: यदि MyLib2 पर निर्भर करता है, तो MyLib1 गतिशील रूप से भी जुड़ा हुआ है, भले ही -Wl,-Bstatic (यानी इस मामले में इसे अनदेखा किया जाता है)। इसे रोकने के लिए आपको MyLib2 स्थिर रूप से भी लिंक करना होगा।





dynamic-linking