2011-12-22 13 views
11

मैंने साझा पुस्तकालयों के आधार पर ऐप्स के साथ असफल होने पर ध्यान दिया है: यदि आप कुछ निर्भरता खो रहे हैं, तो ऐप लोड समय पर असफल हो जाएगा, भले ही उपयोगकर्ता की निर्भरता की कार्यक्षमता का उपयोग करने का कोई इरादा न हो।वैकल्पिक साझा पुस्तकालय

मैं चाहता हूं कि मेरे ऐप्स इससे बेहतर हों। आदर्श रूप में, बल्कि वितरित से n विभिन्न संकुल, जहां एन = numberOfSupportedArchitectures * numberOfSupportedOS * Π (प्रत्येक शेयर की गई लाइब्रेरी के लिए) (विकल्प की संख्या) मैं ", जबकि साझा पुस्तकालयों लोड हो रहा है त्रुटि" एक पकड़ने था अपवाद उत्सर्जित के रूप में कई लोड समय पर जब लाइब्रेरी मैं चाहूंगा- लेकिन इसकी आवश्यकता नहीं है- अनुपस्थित पाया जाता है, फिर इस तरह निष्पादन जारी रखें जो संबंधित अनसुलझे लिंक का उपयोग से बचाता है। लेकिन जाहिर है कि कोई अपवाद नहीं हो सकता है। अगर कुछ गुम हो जाता है, तो यह सब मुख्य() शुरू होने से पहले गिर जाता है।

लोडिंग प्रक्रिया पर नियंत्रण रखने के लिए सबसे नज़दीक मैं अपने सभी लिंक को dlopen, dlsym और ऐसे के साथ हल कर रहा हूं। इतना थकाऊ मुझे उम्मीद है कि मेरे लिए ऐसा करने के लिए पहले से ही एक लाइब्रेरी उपलब्ध होगी?

मुझे लगता है कि यह स्रोत आधारित डिस्ट्रो और न ही विंडोज़ पर कोई मुद्दा नहीं होगा। मैं टैग में बाइनरी-पैकेज डालने जा रहा था लेकिन स्पष्ट रूप से मेरे पास सिक्का टैग का प्रतिनिधि नहीं है।

'ऐसा लगता है कि ओएस के लोडर/लिंकर्स के व्यवहार को परिष्कृत करने में सबसे सुंदर समाधान होगा।

उत्तर

0

आप साझा पुस्तकालयों को स्वयं शामिल कर सकते हैं और -rpath $ORIGIN के माध्यम से लिंकर खोज पथ समायोजित कर सकते हैं।

+0

या प्रोग्राम को एक स्क्रिप्ट के माध्यम से चलाएं जो पर्यावरण चर 'LD_LIBRARY_PATH' सेट करता है। – rodrigo

+0

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

2

आप weak symbols पर एक नज़र डाल सकते हैं। हालांकि, यह सी या सी ++ मानक का हिस्सा नहीं है - इस प्रकार संकलक पर थोड़ा निर्भर है। लेकिन अगर आप जीसीसी के लिए जा रहे हैं, तो यह आपके लिए काम करने जा रहा है, मुझे लगता है।

+0

क्या मुझे पुस्तकालयों के शीर्षकों में हर प्रतीक के लिए निष्क्रिय निकायों को परिभाषित करने की आवश्यकता नहीं है? – mako

+1

वास्तव में नहीं। आप प्रतीक के अस्तित्व के लिए परीक्षण कर सकते हैं। यदि आपके पास 'void foo() है, तो आप उन्हें निम्न तरीके से कॉल कर सकते हैं:' if (foo) foo(); ' – Krizz

+0

आह। लेकिन मुझे उन्हें कमजोर प्रतीकों के रूप में घोषित करना होगा? – mako

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