2010-10-18 21 views
19

के साथ साझा lib से साझा lib से लिंक कैसे करें I फ़ायरफ़ॉक्स प्लगइन पर काम कर रहा हूं जो ब्राउज़र पर 3 डी ग्राफिक्स प्रस्तुत करने के लिए बाहरी पुस्तकालयों का उपयोग करता है।सापेक्ष पथ

समस्या यह है कि मैं प्लगइन को LD_LIBRARY_PATH चर बदलने के बिना इसके साथ पैक किए गए बाहरी पुस्तकालयों का उपयोग करना चाहता हूं।
लाइब्रेरी प्लगइन (एक साझा लाइब्रेरी भी) के सापेक्ष स्थिति में स्थापित हैं, जबकि वास्तविक निष्पादन योग्य (यानी ब्राउज़र) कहीं और पूरी तरह से स्थित हो सकता है।

कुछ चीजें जो आपको जाननी चाहिए। मैं Ubuntu (प्लगइन के Windows संस्करण में कोई समस्या) मेरे निर्भरता पर यह परीक्षण कर रहा हूँ OpenSceneGraph पुस्तकालयों और स्थिर संकलन प्लगइन वास्तव में बड़ी (नहीं अगर वहाँ एक और एक है एक विकल्प)

आशा है कि आप कर सकते हैं कर देगा रहे हैं मेरी मदद करें

सर्वश्रेष्ठ संबंध।

+2

यह उपयोगी हो सकता है: http://stackoverflow.com/प्रश्न/3015411/शिपिंग-gnu-linux-firefox-plugin-with-shared-libraries-for-installation-no- –

+0

दिलचस्प, मैं एक साधारण परीक्षण कार्यक्रम के साथ पुष्टि कर सकता हूं। यह 'lib2' और 'lib1' लिंक को' lib2' 'लिंक लोड करने के लिए' dlopen() 'का उपयोग करता है और इसे सापेक्ष पथ से लोड करने के लिए' $ ORIGIN' का उपयोग करता है। यह बिना किसी समस्या के काम करता है। –

उत्तर

0

आप संकल्प के दौरान -L ध्वज का उपयोग कर सकते हैं ताकि संबंधित पथ निर्दिष्ट हो सके जहां लिंकर आपके साझा ऑब्जेक्ट्स को ढूंढ सके।

यदि आप पहले से ही अपना lib उत्पन्न कर चुके हैं, तो आप सीधे ld कमांड का आह्वान करके लिंक कर सकते हैं।

युक्तियाँ: आप आसानी से जांच सकते हैं कि यूनिक्स कमांड nm का उपयोग करके कुछ प्रतीकों को lib में परिभाषित किया गया है या नहीं। यह जांचने का एक उपयोगी तरीका है कि लिंक अच्छी तरह से किया गया है।

(अगर मैं तुम्हें थे, मैं सिर्फ temporaly LD_LIBRARY_PATH बदलने के रूप में आप अपनी पोस्ट में कहा। क्यों नहीं है यदि आप ऐसा करना चाहेगा?)

+0

यह पुस्तकालयों को ढूंढने वाले लिंकर के बारे में नहीं है, यह लोडर को वर्तमान में लोड होने वाली लाइब्रेरी से संबंधित किसी स्थान पर ढूंढने के बारे में है (प्लगइन)। प्लगइन्स के साथ आप यह नियंत्रित नहीं कर सकते कि मेजबान प्रक्रिया (यानी ब्राउज़र) कैसे आती है, इस प्रकार पर्यावरण चर इसे नहीं करेंगे। ओएस एक्स '@ loader_path' पर चाल है, लिनक्स पर मुझे नहीं पता। –

+0

खराब पढ़ने के लिए खेद है। हो सकता है कि करने के लिए सबसे अच्छी बात रनटाइम पर lib लोड करने के लिए भाषा विशिष्ट कमांड का उपयोग कर रही है। अगर मुझे इसे ठीक से हल करने का कोई तरीका नहीं मिल रहा है तो मैं शायद कल इस जवाब को हटा दूंगा। – ThR37

+0

सामान्य गतिशील लोडिंग में स्टब्स नहीं होने का बड़ा नुकसान होता है, इसलिए आपको मैन्युअल रूप से प्रतीकों को हल करना होगा:/ –

26

जब जोड़ने rpath विकल्प का उपयोग करें और 'विशेष निर्दिष्ट 'पथ $ ओरिजिन

उदाहरण: http://www.itee.uq.edu.au/~daniel/using_origin/

+5

लिंक टूटा हुआ है (5 साल पुराना हाँ मुझे पता है :)) – dashesy

+0

[वेबैक मशीन] (https: // web.archive.org/web/20130915172134/http://itee.uq.edu.au/~daniel/using_origin/) बचाव के लिए :) – 865719

+0

इसके अलावा, [ऐसा लगता है] (https://en.wikipedia.org/विकी/आरपीएथ) कि ['chrpath'] (http://man.devl.cz/man/1/chrpath) और [' patchelf'] (http://man.devl.cz/man/1/patchelf) भी मदद कर सकते हैं (मैंने अभी तक उनकी कोशिश नहीं की है ...) – 865719

-2

यह सुरक्षा कारण के लिए रिश्तेदार rpath उपयोग करने के लिए गलत है,

आप libdl कार्यों का उपयोग करना चाहिए:

-Wl,-R,'$ORIGIN/../lib' 

यहाँ एक साइट है कि $ मूल के प्रयोग पर बताते है (dlopen, आदि)

+3

यदि खराब तरीके से कार्यान्वित किया जाता है, तो आरपीएथ का उपयोग निश्चित रूप से समस्याएं पैदा कर सकता है, लेकिन लिनक्स (और अन्य सिस्टम) ने सुरक्षा उपायों का निर्माण किया है। उदाहरण के लिए, कुछ परिस्थितियों में, ld.so ओरीजिन का विस्तार नहीं करेगा। इसके अतिरिक्त, रिलायटेबल प्रोग्राम के लिए सापेक्ष पथ बिल्कुल जरूरी हैं; अन्यथा, आप किसी निश्चित स्थान पर सॉफ़्टवेयर पैकेज स्थापित करना समाप्त कर देते हैं - उदाहरण के लिए, मैटलैब को/usr/share/matlab पर हमेशा/opt/matlab, या/usr/local/matlab, आदि जैसे कुछ स्थापित करने के लिए मजबूर होना पड़ता है। –

+1

इसके अलावा, लोग ओरीजिन विस्तार का उपयोग करने के बारे में सूचित निर्णय ले सकते हैं, खासकर यदि प्रश्न में सॉफ़्टवेयर स्वयं के निर्माण का है और अपने हार्डवेयर पर उपयोग किया जा रहा है। –

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