साझा पुस्तकालयों को लोड करते समय लिनक्स त्रुटि: साझा किए गए ऑब्जेक्ट फ़ाइल को नहीं खोल सकते: ऐसी कोई फ़ाइल या निर्देशिका नहीं


356

कार्यक्रम एक्सनोमाइ टेस्ट सूट का हिस्सा है, जो लिनक्स पीसी से लिनक्स + एक्सनोमई एआरएम टूलचैन में क्रॉस-संकलित है।

# echo $LD_LIBRARY_PATH                                                                                                                                          
/lib                                                                                                                                                             
# ls /lib                                                                                                                                                        
ld-2.3.3.so         libdl-2.3.3.so      libpthread-0.10.so                                                                                                       
ld-linux.so.2       libdl.so.2          libpthread.so.0                                                                                                          
libc-2.3.3.so       libgcc_s.so         libpthread_rt.so                                                                                                         
libc.so.6           libgcc_s.so.1       libstdc++.so.6                                                                                                           
libcrypt-2.3.3.so   libm-2.3.3.so       libstdc++.so.6.0.9                                                                                                       
libcrypt.so.1       libm.so.6                                                                                                                                    
# ./clocktest                                                                                                                                                    
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory                                 

संपादित करें: ठीक है मैंने नोटिस नहीं किया है ।1 अंत में फ़ाइल नाम का हिस्सा था। वैसे भी इसका क्या मतलब है?


277
यदि आपने हाल ही में एक साझा लाइब्रेरी स्थापित की है और बाद में ldconfig (8) नहीं चलाया है तो ऐसा हो सकता है। 'Ldconfig' करें, इसमें कोई बुराई नहीं है।
AbiusX

25
+1 से @AbiusX टिप्पणी - सुडोकू ldconfig चल रहा है (यह मानते हुए कि पुस्तकालय वास्तव में हैं जहाँ उन्हें होना चाहिए [/ usr / bin / lib /, / usr / bin / शामिल /, / usr / स्थानीय / lib / / usr / स्थानीय / / AFAIK शामिल करें], कृपया मुझे सही करें अगर मैं गलत हूं) तो उस समस्या को हल कर सकते हैं। चीयर्स!
एयरोक्रॉस

ध्यान दें कि यह त्रुटि तब भी उत्पन्न हो सकती है यदि आपकी लीबी फ़ाइल की अनुमतियाँ किसी तरह बदल गई हों। अनुमतियों को 644 में बदलने से यह मेरे लिए हल हो गई।
ज्योफ्री एच।

जवाबों:


139

अपडेट करें
जबकि मैं जो लिखता हूं वह साझा पुस्तकालयों के बारे में एक सामान्य उत्तर के रूप में सच है, मुझे लगता है कि इन प्रकार के संदेश का सबसे अक्सर कारण है क्योंकि आपने एक पैकेज स्थापित किया है, लेकिन उस पैकेज के "-देव" संस्करण को स्थापित नहीं किया है।


खैर, यह झूठ नहीं है - libpthread_rt.so.1उस सूची में कोई भी नहीं है। आपको संभवतः इसे फिर से कॉन्फ़िगर करने और फिर से बनाने की आवश्यकता है ताकि यह आपके पास मौजूद पुस्तकालय पर निर्भर हो या जो कुछ भी प्रदान करता है उसे स्थापित करें libpthread_rt.so.1

आम तौर पर, .so के बाद की संख्याएं संस्करण संख्याएँ होती हैं, और आप अक्सर पाएंगे कि वे एक-दूसरे के लिए सहानुभूति रखते हैं, इसलिए यदि आपके पास libfoo.so का संस्करण 1.1 है, तो आपके पास एक वास्तविक फ़ाइल libfoo.so.1.0 होगा, और symfinks foo.so और foo.so.1 libfoo.so.1.0 की ओर इशारा करते हैं। और यदि आप दूसरे को हटाए बिना संस्करण 1.1 स्थापित करते हैं, तो आपके पास एक libfoo.so.1.1 होगा, और libfoo.so.1 और libfoo.so अब नए को इंगित करेंगे, लेकिन किसी भी कोड को उस सटीक संस्करण की आवश्यकता हो सकती है libfoo.so.1.0 फ़ाइल का उपयोग करें। कोड जो केवल संस्करण 1 एपीआई पर निर्भर करता है, लेकिन यह परवाह नहीं करता है कि यह 1.0 या 1.1 है, यह libfoo.so.1 को निर्दिष्ट करेगा। जैसा कि orip ने टिप्पणियों में बताया है, यह http://tldp.org/HOWTO/Program-Library-HOWTO/sared-lbooks.html पर अच्छी तरह से समझाया गया है ।

आपके मामले में, आप सहानुभूति रखने से दूर हो सकते हैं । कोई गारंटी नहीं है कि यह आपके कोड को नहीं तोड़ेगा और आपके टीवी रात्रिभोज को खाएगा।libpthread_rt.so.1libpthread_rt.so


5
... हे भगवान, .1 फिल्नाम का हिस्सा है। किसी भी विचार का क्या मतलब है?
ज़रातुस्तरा

उस लिंक के लिए orip एक +1 का हकदार है। अगर आपको कोई आपत्ति नहीं है, तो @orip, मैं आपके लिंक को उत्तर में रखना चाहूंगा?
पॉल टॉम्बलिन

@PaulTomblin, मैं ग्रब की मरम्मत करते समय समान त्रुटि प्राप्त कर रहा हूं। क्या आप इस बारे में मेरी मदद कर सकते हैं? यह प्रश्न -> askubuntu.com/questions/123275/cant-repair-grub/…
Eray

@TomNysetvold और पॉल, हाँ - यह एक ही दस्तावेज है।
२०:५२

मुझे इस उत्तर के लिए मेरी खोज में बहुत सारी बुरी जानकारी और गोल चक्कर के समाधान मिले। मेरे अंदर के कुछ ने मुझे तब तक खोजते रहने को कहा जब तक कि मुझे एकल-कमांड समाधान नहीं मिला।
c ..

326

आपका पुस्तकालय एक गतिशील पुस्तकालय है। आपको ऑपरेटिंग सिस्टम को बताने की आवश्यकता है जहां वह इसे रनटाइम पर पता लगा सकता है।

ऐसा करने के लिए, हमें उन आसान चरणों को करने की आवश्यकता होगी:

(1) यदि आपको नहीं पता है तो लाइब्रेरी कहां रखी गई है, इसका पता लगाएं।

sudo find / -name the_name_of_the_file.so

(2) गतिशील पुस्तकालय पथ पर्यावरण चर के अस्तित्व की जाँच करें ( LD_LIBRARY_PATH)

$ echo $LD_LIBRARY_PATH

यदि कुछ प्रदर्शित नहीं करना है, तो डिफ़ॉल्ट पथ मान जोड़ें (या यदि आप चाहें तो नहीं)

$ LD_LIBRARY_PATH=/usr/local/lib

(3) हम इच्छा पथ जोड़ते हैं, इसे निर्यात करते हैं और आवेदन का प्रयास करते हैं।

ध्यान दें कि पथ निर्देशिका होना चाहिए जहां path.so.somethingहै। तो अगर path.so.somethingहै में /my_library/path.so.somethingयह होना चाहिए:

$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app

स्रोत: http://www.gnu.org/software/gsl/manual/html_node/Sared-Lbooks.html


3
उपर्युक्त उत्तर बहुत स्पष्ट था, धन्यवाद सबसे पहले। मैंने अपने ग्रहण सीडीटी प्रोजेक्ट पथ (लुबंटू) में ऐसा करने की कोशिश की। / डीबग $ इको $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "//ome/akhil/HDE/x86.linux/lib" यह वह जगह है जहाँ " मेरे पुस्तकालय वास्तव में भी उपलब्ध हैं, लेकिन फिर भी मुझे वही त्रुटि मिलती है। कोई सुझाव!
नाहस्पेमापेटिलोन

12
अपने लाइब्रेरी को निर्यात करने के बाद "ldconfig" कमांड आज़माएं। आपको "sudo" के रूप में इस कमांड को निष्पादित करने की आवश्यकता हो सकती है।
XOR

5
चरण 1 (1) में सभी कमांड्स को findअकेले पूरा किया जा सकता है :find / -name the_name_of_the_file.so
wbadart

3
मेरा मानना LD_LIBRARY_PATHहै कि निर्देशिका को इंगित करना चाहिए path.so.something, path.so.somethingस्वयं को नहीं ।
गेरिट

2
आपकी आज्ञाओं का पालन करते हुए कदम दर कदम मेरी समस्या हल हो गई! अनेक अनेक धन्यवाद!
फिशर कोडर

156

यहां कुछ उपाय दिए गए हैं जिन्हें आप आजमा सकते हैं:

ldconfig

जैसा कि एबियस ने कहा था: यदि आपने अभी पुस्तकालय स्थापित किया है, तो आपको बस ldconfig चलाने की आवश्यकता हो सकती है ।

sudo ldconfig

ldconfig कमांड लाइन पर फ़ाइल /etc/ld.so.conf, और विश्वसनीय निर्देशिकाओं (/ lib और usr / lib) में निर्दिष्ट निर्देशिकाओं में पाए जाने वाले सबसे हाल ही में साझा किए गए पुस्तकालयों के लिए आवश्यक लिंक और कैश बनाता है।

आमतौर पर जब आप एक नया पुस्तकालय स्थापित करते हैं, तो आपका पैकेज मैनेजर इस बात का ध्यान रखेगा, लेकिन हमेशा नहीं, और यह ldconfig चलाने के लिए चोट नहीं पहुंचाएगा, भले ही वह आपका मुद्दा न हो।

देव पैकेज या गलत संस्करण

अगर वह काम नहीं करता है, तो मैं पॉल के सुझाव की भी जांच करूंगा और लाइब्रेरी के "-देवा" संस्करण की तलाश करूंगा । कई पुस्तकालय देव और गैर-देव संकुल में विभाजित हैं। आप इसे देखने के लिए इस कमांड का उपयोग कर सकते हैं:

apt-cache search <libraryname>

यह भी मदद कर सकता है अगर आप बस पुस्तकालय का गलत संस्करण स्थापित है। कुछ पुस्तकालयों को अलग-अलग संस्करणों में एक साथ प्रकाशित किया जाता है, उदाहरण के लिए, पायथन।

पुस्तकालय का स्थान

यदि आप सुनिश्चित हैं कि सही पैकेज स्थापित है, और ldconfig को नहीं मिला है, तो यह सिर्फ एक गैर-मानक निर्देशिका में हो सकता है। डिफ़ॉल्ट रूप से, ldconfig में लग रहा है /lib, /usr/libऔर में सूचीबद्ध निर्देशिका /etc/ld.so.confऔर $LD_LIBRARY_PATH। यदि आपकी लाइब्रेरी कहीं और है, तो आप या तो निर्देशिका को अपनी लाइन में /etc/ld.so.confजोड़ सकते हैं, लाइब्रेरी के पथ को जोड़ सकते हैं $LD_LIBRARY_PATH, या लाइब्रेरी में ले जा सकते हैं /usr/lib। फिर चला ldconfig

यह जानने के लिए कि लाइब्रेरी कहाँ है, यह आज़माएँ:

sudo find / -iname *libraryname*.so*

( librarynameअपने पुस्तकालय के नाम से बदलें )

यदि आप $LD_LIBRARY_PATHमार्ग पर जाते हैं, तो आप इसे अपनी ~/.bashrcफ़ाइल में रखना चाहेंगे ताकि यह आपके लॉग इन करने पर हर बार चले:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library

3
डिफ़ॉल्ट रूप से, / lib और / usr / lib लेकिन नहीं / usr / स्थानीय / lib? इसने मुझे मेरे करियर और बर्बाद हुए घंटों में कई बार फेंक दिया।
डैरनव

मेरे लिए @DarenW हमारे / usr / लोकल / लिब के साथ काम करता है। उबंटू 14.04 एलटीएस।
gon1332

.confगैर-मानक आवश्यक रास्तों के साथ अपनी खुद की फ़ाइलों को जोड़ना मुझे /etc/ld.so.conf.d(इंगित द्वारा /etc/ld.so.conf) चाल की जरूरत थी।
CivFan

4
Ldconfig को चलाने की आवश्यकता के लिए +1। मैं पैकेज मैनेजर का उपयोग नहीं कर रहा था। मुझे स्रोत से संकलन करना था, इसलिए यह आवश्यक था।
जेफ

7
इसका असली जवाब है
स्कॉट स्टेंसलैंड

53

मेरे पास समान त्रुटि थी, मैं इसे देकर हल कर सकता था,

sudo ldconfig -v

उम्मीद है की यह मदद करेगा।


37
हाय, यह अच्छी तरह से समस्या को हल कर सकता है ... लेकिन यह अच्छा होगा यदि आप अपना उत्तर संपादित कर सकते हैं और इसके बारे में थोड़ी व्याख्या प्रदान कर सकते हैं कि यह कैसे और क्यों काम करता है :) मत भूलना - ढेर अतिप्रवाह पर newbies के ढेर हैं, और वे आपकी विशेषज्ञता से एक या दो सीख सकते हैं - जो आपके लिए स्पष्ट है वह उनके लिए ऐसा नहीं हो सकता है।
टैरिन पूर्व

वह इसकी व्याख्या नहीं कर पाएंगे। उसने बस उसका जवाब कॉपी किया।
झौरलाड एस्ट्रेला

डुप्लिकेट उत्तर ... ऊपर एक ही उत्तर देखें एक दिन पहले तैयार की गई
स्कॉट स्टेंसलैंड

25

जब आप अपनी .c फ़ाइल संकलित करते हैं, तो आपको यह सुनिश्चित करना होगा कि आप लाइब्रेरी पथ को निर्दिष्ट करें।

gcc -I / usr / लोकल / xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / लोकल / लिब

-Wl; -R भाग परिणामी बाइनरी को भी / usr / lib / में से एक का उपयोग करने की कोशिश करने से पहले रनटाइम में पुस्तकालय / usr / स्थानीय / देयता के लिए देखने के लिए कहता है

आशा है इससे आपकी मदद होगी।


3
यह वह विकल्प है जिसकी मुझे तलाश थी। शायद बेहतर होगा -Wl,-rpath DIR
jrw32982

1
महान! मुझे उस समस्या का सामना करना पड़ा जब मेरा कार्यक्रम सफलतापूर्वक सीमेक के साथ संकलित किया गया था, लेकिन त्रुटि के कारण शुरू नहीं हो सका। उस उत्तर ने मेरे मुद्दे को हल किया
इवान तालालाव

15

जोड़ने की कोशिश करें LD_LIBRARY_PATH, जो आपकी ~/.bashrcफ़ाइल के लिए खोज पथ इंगित करता है

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

यह काम करता हैं!


13

Linux.org संदर्भ पृष्ठ यांत्रिकी की व्याख्या करता है, लेकिन इसके पीछे की किसी भी प्रेरणा की व्याख्या नहीं करता है :-(

उसके लिए, सन लिंकर और लाइब्रेरी गाइड देखें

इसके अलावा, ध्यान दें कि "बाहरी संस्करण" लिनक्स पर काफी हद तक अप्रचलित है, क्योंकि प्रतीक संस्करण (एक GNU एक्सटेंशन) आपको एकल लाइब्रेरी में मौजूद होने के लिए समान फ़ंक्शन के कई असंगत संस्करण रखने की अनुमति देता है। इस विस्तार ने ग्लिब्क को समान बाहरी संस्करण की अनुमति दी: libc.so.6पिछले 10 वर्षों से।


7
cd /home/<user_name>/
sudo vi .bash_profile

इन लाइनों को अंत में जोड़ें

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH

5

मेरे पास एक समान त्रुटि थी और यह ~ / .bashrc में LD_LIBRARY_PATH देने के साथ ठीक नहीं हुई। मेरी समस्या का समाधान .conf फ़ाइल को जोड़कर और उसे लोड करके किया गया है। टर्मिनल में जाओ एक सु में।

gedit /etc/ld.so.conf.d/myapp.conf

इस फ़ाइल में अपना पुस्तकालय पथ जोड़ें और सहेजें। (जैसे: / usr / स्थानीय / परिवाद)। पथ को सक्रिय करने के लिए आपको निम्न आदेश चलाना चाहिए:

ldconfig

अपना नया पुस्तकालय पथ सत्यापित करें:

ldconfig -v | less

यदि यह आपकी लाइब्रेरी फ़ाइलों को दिखाता है, तो आप जाने के लिए अच्छे हैं।


4

आपकी स्थिति के आधार पर एक और संभावित समाधान।

यदि आप जानते हैं कि libpthread_rt.so.1 libpthread_rt.so के समान है, तो आप इसके द्वारा एक सिमलिंक बना सकते हैं:

ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1

फिर ls -l /libअब सिमिलिंक दिखाना चाहिए और यह किस ओर इशारा करता है।


4

लिनक्स x86 पर ग्रहण सीडीटी के साथ अपना एप्लिकेशन चलाते समय मुझे यह त्रुटि हुई थी।
इसे ठीक करने के लिए:

  1. ग्रहण में:

    के रूप में चलाएँ -> रन कॉन्फ़िगरेशन -> पर्यावरण

  2. रास्ता तय करो

    LD_LIBRARY_PATH=/my_lib_directory_path
    

2

मुझे बस इतना करना था:

sudo apt-get install libfontconfig1

मैं फ़ोल्डर में स्थित था /usr/lib/x86_64-linux-gnuऔर यह पूरी तरह से काम करता था।


2

यदि आप Microsoft Windows पर अपना एप्लिकेशन चला रहे हैं, तो PATH परिवेश चर में डायनामिक लाइब्रेरी (.dll) के लिए पथ को परिभाषित करने की आवश्यकता है।

यदि आप UNIX पर अपना एप्लिकेशन चला रहे हैं, तो आपके डायनामिक लाइब्रेरीज़ (.so) का मार्ग LD_LIBRARY_PATH परिवेश चर में परिभाषित किया जाना चाहिए।


1

sudo lib32z1 स्थापित करने का प्रयास करें

sudo apt-get install lib32z1


1

त्रुटि तब होती है जब सिस्टम उल्लिखित लाइब्रेरी फ़ाइल को संदर्भित नहीं कर सकता है। निम्नलिखित कदम उठाएं:

  1. रनिंग locate libpthread_rt.so.1उस नाम के साथ सभी फाइलों के पथ को सूचीबद्ध करेगा। मान लीजिए एक रास्ता है /home/user/loc
  2. पथ को कॉपी करें और चलाएं cd home/USERNAME। USERNAME को वर्तमान सक्रिय उपयोगकर्ता के नाम से बदलें जिसके साथ आप फ़ाइल चलाना चाहते हैं।
  3. भागो vi .bash_profileऔर LD_LIBRARY_PATHपैरामीटर के अंत में , बस पहले ., पंक्ति जोड़ें /lib://home/usr/loc:.। फ़ाइल सहेजें।
  4. टर्मिनल बंद करें और एप्लिकेशन को पुनरारंभ करें। इसे चलाना चाहिए।

0

मुझे यह त्रुटि मिली और मुझे लगता है कि इसका भी यही कारण है

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

इसे इस्तेमाल करे। फ़ाइलों पर अनुमतियाँ ठीक करें:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 
chown -R root:root *

"Sudo su" अपने फाइल सिस्टम पर अनुमति प्राप्त करने के लिए।


0

मुझे यह त्रुटि मिली और मुझे लगता है कि इसका भी यही कारण है

साझा पुस्तकालयों को लोड करते समय त्रुटि: libnw.so: साझा की गई ऑब्जेक्ट फ़ाइल को नहीं खोल सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं

इसे इस्तेमाल करे। फ़ाइलों पर अनुमतियाँ ठीक करें:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 

0

इसी तरह की समस्या यहाँ मिली: https://bugzilla.redhat.com/show_bug.cgi?id=1456202 मैंने उल्लेख किया समाधान की कोशिश की है और यह वास्तव में काम करता है।

पिछले प्रश्नों के हल काम कर सकते हैं। लेकिन मुझे लगता है कि इसे ठीक करने का यह एक आसान तरीका है। libwbclient फेडोरा में पैकेज को फिर से स्थापित करने का प्रयास करें :

dnf reinstall libwbclient

0

मैं Ubuntu 18.04 का उपयोग करता हूं

मेरे लिए काम करने वाले "-देव" पैकेज को स्थापित करते हुए,

sudo apt install libgconf2-dev

उपरोक्त पैकेज स्थापित होने तक मुझे नीचे की त्रुटि मिल रही थी,

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.