साझा पुस्तकालय के लिए उबंटू कहां दिखता है?


24

जब मैं एक ऐसी प्रक्रिया चलाता हूं जो किसी साझा लाइब्रेरी को रनटाइम से लिंक करता है (लिंक जब प्रक्रिया शुरू होती है, तो बाद में लिंक नहीं की जाती है dlload()), तो यह उस साझा लाइब्रेरी ( .so) फ़ाइल के अलावा LD_LIBRARY_PATHकहां दिखता है ?

पृष्ठभूमि:

मेरे पास कुछ C ++ कोड हैं जो मैंने लिखा था कि एक विशेष तीसरे पक्ष के पुस्तकालय का उपयोग करता है। मैंने पुस्तकालय स्थापित किया है और दो अलग-अलग प्लेटफार्मों पर अपना कोड संकलित किया है, दोनों उबंटू लेकिन अलग-अलग संस्करण, और जीसीसी के विभिन्न संस्करण भी। पुस्तकालय को स्रोत से संकलित और स्थापित किया गया था, और /usr/local/libदोनों प्लेटफार्मों पर स्थित है । जब मैं अपना कोड संकलित करता हूं, तो मैं pkg-config --libsतीसरे पक्ष के पुस्तकालय के लिए मापदंडों के साथ लिंक करता हूं और मैंने सत्यापित किया है कि pkg-config --libsदोनों प्लेटफार्मों पर एक ही बात वापस करता है।

मेरा कोड दोनों प्लेटफार्मों पर सफलतापूर्वक संकलित है, और दोनों प्लेटफार्मों पर LD_LIBRARY_PATHपरिभाषित नहीं है (या खाली के रूप में परिभाषित किया गया है "")। हालाँकि, जब मैं इसे एक प्लैटोफ़ॉर्म पर चलाता हूं तो यह ठीक काम करता है, और दूसरे पर मुझे यह त्रुटि मिलती है:

error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory

मजेदार रूप से पर्याप्त, जो काम नहीं करता है वह उबंटू और जीसीसी का नया संस्करण है। : /

तो मैं यह पता लगाने की कोशिश कर रहा हूं कि कैसे काम करने वाला पुस्तकालय का पता लगाने में सक्षम है, ताकि मैं टूटी हुई को उसी तरह से पुस्तकालय का पता लगा सकूं। (अर्थात, बिना सेटिंग के LD_LIBRARY_PATH)

अद्यतन करें:

यहाँ से मेरा आउटपुट है cat /etc/ld.so.conf.d/*

... कार्यशील (पुरानी) प्रणाली पर:

/usr/lib/mesa
/usr/lib32/mesa
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

... टूटी (नई) व्यवस्था पर:

# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa

1
मुझे लगता है कि उन जगहों को परिभाषित किया गया है /etc/ld.so.conf.d/*.conf, लेकिन मुझे यकीन नहीं है।
सलेम

ऐसा लगता है, लेकिन उन फ़ाइलों की सामग्री के लिए OQ के लिए मेरा अद्यतन देखें ... तो ऐसा लगता है कि इसे ढूंढना चाहिए, /usr/local/lib/libthrift-0.9.0.soलेकिन फिर भी यह त्रुटि देता है error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory... क्या कोई कारण है कि यह एक निर्देशिका नहीं उठाएगा /etc/ld.so.conf.d/*.conf?
डेव लिल्थुन

3
sudo ldconfig -vनीचे सुझाए अनुसार चलाने का प्रयास करें। यदि यह अभी भी काम नहीं करता है तो आउटपुट के साथ अपने प्रश्न को अपडेट करें ldd /path/to/your/application
सलेम

जवाबों:


29

यह संपूर्ण पथ व्यवसाय मल्टी-आर्क नामक किसी चीज़ से संबंधित है। मूल रूप से यह आपको एक ही सिस्टम पर 32 बिट और 64 बिट लाइब्रेरी की अनुमति देने के लिए है।

फ़ाइल की प्रतिलिपि बनाने के बाद, क्या आपने ldconfig चलाने के लिए क्या किया?

ldconfig  creates,  updates,  and removes the necessary links and cache
       (for use by the run-time linker,  ld.so)  to  the  most  recent  shared
       libraries  found  in  the directories specified on the command line, in
       the file /etc/ld.so.conf, and in the trusted directories (/usr/lib  and
       /lib).   ldconfig  checks the header and file names of the libraries it
       encounters when determining which  versions  should  have  their  links
       updated.  ldconfig ignores symbolic links when scanning for libraries.

मैं भागा sudo ldconfigऔर उस समस्या को ठीक किया! (मुझे अपना कोड या कुछ भी पुनः लिखने की आवश्यकता नहीं थी ...) मैं अभी समझना चाहता हूं, हालांकि ... आपने कहा "फ़ाइल की प्रतिलिपि बनाने के बाद," लेकिन मैंने फ़ाइल की प्रतिलिपि नहीं बनाई। क्या आपके द्वारा लाइब्रेरी बनाने या स्थापित करने के बाद, या मैंने अपना कार्यक्रम संकलित करने के बाद इसका मतलब है?
डेव लिल्थुन

तुम्हारे जाने के बाद जहाँ तुमने उसे रखा था। मूल रूप से एक पुस्तकालय कैश बनाया गया है। मुझे लगता है कि रिबूट करने से कैश का पुनर्निर्माण भी हो सकता है।
मैट एच।

मुझसे गलती हो सकती है, लेकिन मेरा मानना ​​है कि मैंने पुस्तकालय स्थापित करने के बाद से रिबूट sudo ldconfigकिया था ... हालांकि, चाल चली। क्या यह कुछ लाइब्रेरीज़ अक्सर आपके इंस्टॉल के हिस्से के रूप में आपके लिए चलती हैं, और यह किसी कारण से नहीं हुई? बस सोचता हूं कि मुझे "सामान्य रूप से" ऐसा क्यों नहीं करना है, लेकिन केवल इस मामले में किया है ...
डेव लिलथून

आमतौर पर पैकेज स्थापित मुझे लगता है कि स्थापित प्रक्रिया के दौरान ldconfig चलेगा। हो सकता है कि आपके नए डिस्ट्रो पर संस्करण किसी कारण से ऐसा नहीं कर रहा हो।
मैट एच।

1

उपरोक्त प्रश्न और पहले (और केवल एटीटी) उत्तर में निहित जानकारी ने मुझे WSL Ubuntu पर (Win10 64 पर) एक * समान * मुद्दे को हल करने में मदद की !

मेरे मामले में निष्पादन योग्य एक पुस्तकालय नहीं मिल सका। मैंने अंततः ध्यान दिया कि नव-निर्मित पुस्तकालय को इसमें स्थान मिला है /usr/lib64, लेकिन उस निर्देशिका में बहु-आर्क लाइनों को शामिल नहीं/etc/ld.so.conf.d/x86_64-linux-gnu.conf किया गया है ।

तो मैं भागा

sudo ldconfig /usr/lib64

और आखिरकार इसे ठीक कर लिया। (निर्देशिका पैरामीटर के बिना इसे अकेले चलाने से यह 'जादुई रूप से पुस्तकालयों BTW को खोजने के लिए नहीं बना था।) यह स्पष्ट नहीं है कि क्या मेरे WSL बैश को' पुनरारंभ 'करने से मदद मिली ... मुझे लगता है कि इसकी आवश्यकता भी नहीं थी।


वही मेरे साथ / usr / स्थानीय / lib / के साथ हुआ। मैंने एक फ़ाइल बनाई /etc/ld.so.conf.d/usr-local.confऔर फिर sudo ldconfigकोई प्रभाव नहीं डाला - उस डायर में पुस्तकालयों को लोडर द्वारा नहीं मिला। sudo ldconfig /usr/local/libसब कुछ चलाने के बाद ठीक काम किया।
जोश मिल्थोरपे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.