मैं साझा लाइब्रेरी के कई संस्करण क्यों नहीं स्थापित कर सकता हूं?


10

अक्सर ऐसे उदाहरण होते हैं जहां एक निश्चित कार्यक्रम लाइब्रेरी संस्करण xy और xz पर दूसरे पर निर्भर करेगा लेकिन, जहां तक ​​मुझे जानकारी है, कोई भी पैकेज प्रबंधक मुझे xy और xz दोनों को स्थापित करने की अनुमति नहीं देगा कभी-कभी वे दोनों प्रमुख संस्करणों (जैसे) qt4 और qt5, जो एक ही समय में स्थापित किए जा सकते हैं), लेकिन (प्रतीत होता है) कभी भी मामूली संस्करण नहीं हैं।

ऐसा क्यों है? के रूप में, क्या सीमित कारक है जो इसे रोकता है? मुझे लगता है कि यह उचित रूप से उपयोगी कार्यक्षमता की अनुमति नहीं देने के लिए एक अच्छा कारण होना चाहिए। उदाहरण के लिए, किसी साझा ऑब्जेक्ट को लोड करते समय किस संस्करण को लोड करने के लिए इंगित करने के लिए कोई फ़ील्ड नहीं है और इस प्रकार लिनक्स के लिए कोई तरीका नहीं है कि यह कैसे तय किया जाए कि लोड करने के लिए? या वास्तव में इसका कोई कारण नहीं है? वैसे भी सभी छोटे संस्करणों को संगत माना जाता है या कुछ और?

जवाबों:


13

वास्तव में, आप साझा पुस्तकालय के कई संस्करणों को स्थापित कर सकते हैं यदि यह ठीक से किया गया हो।

साझा पुस्तकालयों को आमतौर पर इस प्रकार नामित किया जाता है:

lib<name>.so.<api-version>.<minor>

अगला, निम्नलिखित नामों के तहत पुस्तकालय में सीमलिंक हैं:

lib<name>.so
lib<name>.so.<api-version>

जब कोई डेवलपर बाइनरी का निर्माण करने के लिए लाइब्रेरी के खिलाफ लिंक करता है, तो यह फ़ाइल नाम है .soजो उस लिंकर में समाप्त होता है। वास्तव में किसी भी दिए गए समय के लिए केवल एक ही स्थापित किया जा सकता है, <name>लेकिन इसका मतलब केवल यह है कि एक डेवलपर एक ही समय में एक पुस्तकालय के कई अलग-अलग संस्करणों को लक्षित नहीं कर सकता है। पैकेज प्रबंधकों के साथ, यह .soसिम्लिंक एक अलग -devपैकेज का हिस्सा है जिसे केवल डेवलपर्स को स्थापित करने की आवश्यकता होती है।

जब लिंकर एक फ़ाइल को समाप्त होने वाले नाम के साथ पाता है .soऔर इसका उपयोग करता है, तो यह सोनमे नामक क्षेत्र के लिए उस लाइब्रेरी के अंदर दिखता है । सोनम लिंकर को सलाह देता है कि परिणामी बाइनरी में एम्बेड करने के लिए कौन सा फ़ाइल नाम दिया जाए और इस प्रकार रनटाइम में क्या फ़ाइल नाम मांगा जाएगा। माना जाता है कि सोनम को सेट किया जाना है lib<name>.so.<api-version>

इसलिए, रन टाइम पर, डायनेमिक लिंकर उस की तलाश lib<name>.so.<api-version>और उपयोग करेगा ।

इरादा यह है कि:

  • <minor>उन्नयन पुस्तकालय के एपीआई को नहीं बदलता है और जब <minor>उच्च संस्करण से टकरा जाता है, तो सभी बायनेरिज़ को नए संस्करण में अपग्रेड करने देना सुरक्षित है। चूंकि बायनेरिज़ सभी lib<name>.so.<api-version>नाम के तहत लाइब्रेरी की मांग कर रहे हैं , जो कि नवीनतम स्थापित के लिए एक सिमलिंक है lib<name>.so.<api-version>.<minor>, उन्हें अपग्रेड मिलता है।
  • <api-version>उन्नयन पुस्तकालय के एपीआई को बदल देता है, और मौजूदा द्विआधारी अनुप्रयोगों को नए संस्करण का उपयोग करने देना सुरक्षित नहीं है। इस मामले में, जो <api-version>बदल गया है, क्योंकि वे अनुप्रयोग नाम की तलाश में हैं, lib<name>.so.<api-version>लेकिन इसके लिए एक अलग मूल्य के साथ <api-version>, वे नए संस्करण को नहीं लेंगे।

पैकेज मैनेजर अक्सर एक ही वितरण संस्करण के भीतर एक ही लाइब्रेरी के एक से अधिक संस्करण को पैकेज नहीं करते हैं क्योंकि संपूर्ण वितरण, जिसमें सभी बायनेरिज़ शामिल हैं जो लाइब्रेरी का उपयोग करते हैं, आमतौर पर वितरण से पहले हर लाइब्रेरी के एक सुसंगत संस्करण का उपयोग करने के लिए संकलित किया जाता है। का विमोचन किया। यह सुनिश्चित करना कि सब कुछ सुसंगत है और वितरण में सब कुछ सब कुछ के साथ संगत है, वितरकों के लिए कार्यभार का एक बड़ा हिस्सा है।

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

  • एक पुराने डेबियन से libmysqlclient16 , libmysqlclient.so.16.0.0सम्‍मिलित और सम्‍मिलित है libmysqlclient.so.16
  • वर्तमान डेबियन से libmysqlclient18 , libmysqlclient.so.18.0.0सम्‍मिलित और सम्‍मिलित है libmysqlclient.so.18

4

यह कार्यक्षमता अस्वीकृत नहीं है, यह अधिकांश पुस्तकालयों की संख्या के काम करने के तरीके के परिणामस्वरूप बहुत सामान्य नहीं है और पैकेज नाम परिवर्तन की असुविधा के कारण है।

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

ऐसा कोई कारण नहीं होना चाहिए कि आप नवीनतम बग को ठीक नहीं करना चाहते हैं, और पिछड़े संगत परिवर्तन आपके सॉफ़्टवेयर को भी नहीं तोड़ना चाहिए।

यदि लाइब्रेरी को इस तरह से विकसित किया जाता है तो आपको XYZ को X (Y + m) से बदलने में हमेशा सक्षम होना चाहिए। (Z + n)। किसी भी एम और एन के लिए। यानी आपको हमेशा अपनी लाइब्रेरी को उसी प्रमुख नंबर श्रृंखला में नवीनतम के साथ बदलने में सक्षम होना चाहिए। और अगर लाइब्रेरी डेवलपर्स सावधान हैं और अगली बड़ी संख्या संगत है (उदाहरण के लिए चीजों को पदावनत करने की घोषणा द्वारा, लेकिन उन्हें अभी तक नहीं हटाएं) तो आप अगले प्रमुख नंबर का उपयोग भी कर सकते हैं।

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

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

एक काउंटर उदाहरण है, लेकिन एक पुस्तकालय का नहीं अजगर अजगर दुभाषिया है, जो एक मामूली संख्या परिवर्तन पर अपनी साझा वस्तुओं और अचार प्रारूप पर संगत नहीं है। इसलिए आपको अजगर (2.7 श्रृंखला में नवीनतम) और अजगर 3 (वर्तमान में पायथन 3.4 श्रृंखला) के साथ-साथ अजगर 2.6 के लिए स्पष्ट पैकेज (कम आम नहीं मिल रहा) और अजगर 3.3 के लिए पैकेज दिखाई देंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.