.dll
या .so
, साझा कर रहे हैं libs (क्रम में जुड़े हुए), जबकि .a
और .lib
एक स्थिर पुस्तकालय (संकलन समय में जुड़े हुए) है। यह विंडोज और लिनक्स के बीच कोई अंतर नहीं है।
अंतर है, उन्हें कैसे संभाला जाता है। नोट: अंतर केवल सीमा शुल्क में है, उनका उपयोग कैसे किया जाता है। विंडोज के रास्ते पर लिनक्स बनाने और इसके विपरीत बनाने के लिए बहुत मुश्किल नहीं होगा, सिवाय इसके कि व्यावहारिक रूप से कोई भी ऐसा नहीं करता है।
यदि हम एक dll का उपयोग करते हैं, या हम अपने स्वयं के बाइनरी से भी एक फ़ंक्शन कहते हैं, तो एक सरल और स्पष्ट तरीका है। उदाहरण के लिए, C में, हम देखते हैं कि:
int example(int x) {
...do_something...
}
int ret = example(42);
हालाँकि, asm स्तर पर, कई अंतर हो सकते हैं। उदाहरण के लिए, x86 पर, एक call
opcode निष्पादित किया जाता है, और 42
स्टैक पर दिया जाता है। या कुछ रजिस्टरों में। या कहीं भी। कोई नहीं जानता कि डीएल लिखने से पहले , इसका उपयोग कैसे किया जाएगा। या परियोजनाएं इसका उपयोग कैसे करना चाहती हैं, संभव है कि एक संकलक (या किसी भाषा में!) के साथ लिखा जाए जो अब भी मौजूद नहीं है (या यह dll के डेवलपर्स के लिए अज्ञात है)।
उदाहरण के लिए, डिफ़ॉल्ट रूप से, सी और पास्कल दोनों स्टैक से तर्क (और रिटर्न मान प्राप्त करते हैं) - लेकिन वे इसे अलग-अलग क्रम में कर रहे हैं । आप कुछ - कंपाइलर-निर्भर - अनुकूलन द्वारा रजिस्टरों में अपने कार्यों के बीच तर्कों का आदान-प्रदान भी कर सकते हैं।
जैसा कि आप ठीक से देखते हैं, विंडोज कस्टम यह है कि एक dll का निर्माण, हम एक न्यूनतम .a
/ इसके .lib
साथ भी बनाते हैं । यह न्यूनतम स्थिर पुस्तकालय केवल एक आवरण है, इसके माध्यम से उस dll के प्रतीकों (कार्यों) तक पहुंचा जाता है। यह आवश्यक एएसएम-स्तरीय कॉलिंग रूपांतरण बनाता है।
इसका लाभ संगतता है। इसका नुकसान यह है कि यदि आपके पास केवल एक .dll है, तो आपके पास यह पता लगाने के लिए एक कठिन समय हो सकता है कि इसके कार्यों को कैसे बुलाया जाना चाहिए। यह dlls का उपयोग हैकिंग कार्य करता है, यदि dll का डेवलपर आपको नहीं देता है.a
। इस प्रकार, यह मुख्य रूप से बंद होने के उद्देश्यों को पूरा करता है, उदाहरण के लिए एसडीके के लिए अतिरिक्त नकदी प्राप्त करना आसान है।
इसका एक और नुकसान यह है कि यदि आप एक डायनेमिक लाइब्रेरी का उपयोग करते हैं, तो भी आपको इस छोटे रैपर को सांख्यिकीय रूप से संकलित करने की आवश्यकता है।
लिनक्स में, dlls का बाइनरी इंटरफ़ेस मानक है और C कन्वेंशन का अनुसरण करता है। इस प्रकार, कोई .a
आवश्यकता नहीं है और साझा किए गए कामों के बीच द्विआधारी संगतता है, बदले में हमारे पास Microsoft कस्टम के फायदे नहीं हैं।