2011-09-15 9 views
5

मैं प्रोजेक्ट के किसी भी पुस्तकालय में त्वरित सुधार करना चाहता हूं। क्या एसएसओ को फिर से सम्मिलित करना और मूल को प्रतिस्थापित करना सुरक्षित है? या मुझे पूरी परियोजना का पुनर्निर्माण और पुनर्स्थापित करना होगा? या यह निर्भर करता है?लिनक्स पर प्रोजेक्ट में साझा पुस्तकालयों (.so) में से किसी एक में फ़िक्स कैसे करें?

+0

मेकफ़ाइल पर यह निर्णय लेने के लिए नहीं है कि किन घटकों को पुनर्निर्माण की आवश्यकता है? तो आपको देखना चाहिए कि आपको कौन सी फाइलों को बदलना चाहिए। –

+0

@ott: रनटाइम के बारे में जानने या देखभाल करने वाला नहीं है। इसलिए जब तक आप इसे नहीं बताते तब तक deps। यह निश्चित रूप से व्यावहारिक नहीं है कि एबीआई के बारे में निर्णय लेने के लिए उसे क्या करना है। –

उत्तर

4

यह निर्भर करता है। आपके निष्पादन योग्य के साथ साझा लाइब्रेरी binary-compatible होना चाहिए।

उदाहरण के लिए,

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

अंगूठे (उत्पादन रिलीज के लिए) का नियम है कि, अगर आप जानबूझकर जानकारी नहीं है कि आप दोहरी संगतता बनाए रखने रहे हैं, या नहीं यकीन है कि क्या दोहरी संगतता है, तो आप पुन: संयोजित करना चाहिए।

+0

3 के संबंध में: डिफ़ॉल्ट पैरामीटर में परिवर्तन एबीआई पर शून्य प्रभाव पड़ता है। सीडीसीएल कॉल के लिए (सी में डिफ़ॉल्ट, और जीसीसी में इस के लिए), कॉलर वास्तव में ढेर को साफ करता है। उम्मीद से अधिक पैरामीटर पास करना भी ठीक है, लेकिन दाएं से बाएं कॉलिंग सम्मेलनों के लिए कम नहीं है। –

+0

@ मैट, मैंने * डिफ़ॉल्ट * तर्कों का उल्लेख नहीं किया, केवल तर्क। :) इसके अलावा, लाइब्रेरी पक्ष पर अधिक तर्क के साथ समाप्त होने के बजाय, अधिक कम है, इसलिए लाइब्रेरी कचरा मूल्यों तक पहुंचने का प्रयास करेगी। –

1

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

निश्चित रूप से हमेशा किनारे के मामले हैं जहां एक कार्यक्रम किसी फ़ंक्शन के कुछ अनियंत्रित दुष्प्रभाव पर निर्भर करता है, और फिर उस फ़ंक्शन के कार्यान्वयन को बदलने से साइड इफेक्ट बदल सकता है और प्रोग्राम को तोड़ सकता है; लेकिन c'est la vie

1

यदि आपने साझा लाइब्रेरी के ABI को नहीं बदला है, तो आप लाइब्रेरी को पुनर्निर्माण और प्रतिस्थापित कर सकते हैं।

1

यदि आप अपनी लाइब्रेरी बाइनरी इंटरफ़ेस नहीं बदलते हैं, तो केवल साझा लाइब्रेरी को पुन: संकलित करना और पुन: नियोजित करना ठीक है।

अच्छा संदर्भ:

1

यह हाँ निर्भर करता है।

हालांकि, मुझे लगता है कि आपके पास एक ही स्रोत और कंपाइलर है जो अन्य सामानों का निर्माण करता है और अब यदि आप केवल .cpp फ़ाइल में कुछ बदलते हैं, तो यह ठीक है।

अन्य चीजें उदा। एक हेडर फ़ाइल में एक इंटरफ़ेस (साझा lib और शेष सिस्टम के बीच) को बदलना ठीक नहीं है।

संबंधित मुद्दे

 संबंधित मुद्दे