यहां तक कि अगर आप एक पूरी तरह से योग्य पथ CDLL करने के लिए या cdll.LoadLibrary() देते हैं, तो आप अभी भी अजगर लागू करने से पहले LD_LIBRARY_PATH निर्धारित करने की आवश्यकता हो सकती है। यदि आपके द्वारा लोड की गई साझा लाइब्रेरी स्पष्ट रूप से किसी अन्य साझा लाइब्रेरी को संदर्भित करती है और उस लाइब्रेरी के लिए .so में "rpath" सेट नहीं है, तो यह नहीं मिलेगा, भले ही इसे पहले से लोड किया गया हो। लाइब्रेरी में एक आरपीएथ उस लाइब्रेरी
द्वारा आवश्यक अन्य पुस्तकालयों की खोज के लिए उपयोग किए जाने वाले खोज पथ को निर्दिष्ट करता है उदाहरण के लिए, मेरे पास उत्पादित नहीं होने वाले परस्पर निर्भर तृतीय पक्ष पुस्तकालयों के एक सेट का मामला है। बी.एसओ संदर्भ ए.एस.ओ. यहां तक कि अगर मैं पहले से a.so लोड:
ctypes.cdll.LoadLibrary('/abs/path/to/a.so')
ctypes.cdll.LoadLibrary('/abs/path/to/b.so')
मैं, क्योंकि b.so बस 'a.so' को संदर्भित करता है दूसरा लोड पर कोई त्रुटि मिलती है, एक rpath बिना, और इसलिए b.so नहीं करता ' टी नहीं जानता कि यह सही है। तो मुझे '/ abs/path/to' शामिल करने के लिए अग्रिम में LD_LIBRARY_PATH सेट करना होगा।
LD_LIBRARY_PATH सेट करने से बचने के लिए, आप .so फ़ाइलों में rpath प्रविष्टि को संशोधित करते हैं। लिनक्स पर, दो उपयोगिताएं मिलीं जो मैंने पाया: chrpath, और patchelf। chrpath उबंटू भंडार से उपलब्ध है। यह rpath को बदल नहीं सकता है। इसलिए यह कभी नहीं था। पैचेलफ अधिक लचीला है।
स्रोत
2010-12-01 15:58:50
यह समस्या का निदान करता है लेकिन इसे हल नहीं करता है। – dbliss