ข้อผิดพลาดของ Linux ในขณะที่โหลดไลบรารีที่แชร์: ไม่สามารถเปิดไฟล์วัตถุที่แชร์: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว


356

โปรแกรมเป็นส่วนหนึ่งของชุดทดสอบ Xenomai ซึ่งรวบรวมจาก Linux PC ไปยัง Linux + Xenomai ARM toolchain

# 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                                 

แก้ไข:ตกลงฉันไม่ได้สังเกตเห็น. 0.1 ท้ายที่สุดเป็นส่วนหนึ่งของชื่อไฟล์ นั่นหมายความว่าอย่างไร


277
สิ่งนี้อาจเกิดขึ้นหากคุณเพิ่งติดตั้งไลบรารีที่แบ่งใช้และไม่ได้รัน ldconfig (8) หลังจากนั้น ทำ 'ldconfig' ไม่มีอันตรายใด ๆ
AbiusX

25
ความคิดเห็น +1 ถึง @AbiusX - กำลังรัน sudo ldconfig (สมมติว่าไลบรารีอยู่ในความเป็นจริงโดยที่ควรเป็น [/ usr / bin / lib /, / usr / bin / include /, / usr / local / lib / และ / usr / local / include / AFAIK] โปรดแก้ไขฉันหากฉันผิด) สามารถแก้ไขปัญหานั้นได้ ไชโย!
AeroCross

โปรดทราบว่าข้อผิดพลาดนี้อาจเกิดขึ้นหากสิทธิ์ในไฟล์ lib ของคุณเปลี่ยนไป การเปลี่ยนการอนุญาตกลับเป็น 644 นั้นแก้ไขได้สำหรับฉัน
Geoffrey H

คำตอบ:


139

อัปเดต
ในขณะที่สิ่งที่ฉันเขียนด้านล่างเป็นจริงตามคำตอบทั่วไปเกี่ยวกับไลบรารีที่ใช้ร่วมกันฉันคิดว่าสาเหตุที่พบบ่อยที่สุดของข้อความประเภทนี้คือเนื่องจากคุณได้ติดตั้งแพ็คเกจ แต่ไม่ได้ติดตั้งแพ็คเกจ "-dev" รุ่นนั้น


มันไม่ได้โกหก - ไม่มีlibpthread_rt.so.1ในรายชื่อนั้น libpthread_rt.so.1คุณอาจจำเป็นต้องกำหนดค่าใหม่และอีกครั้งสร้างมันเพื่อให้มันขึ้นอยู่กับห้องสมุดที่คุณมีหรือติดตั้งสิ่งที่ให้

โดยทั่วไปแล้วตัวเลขหลังจาก. so คือหมายเลขเวอร์ชันและคุณมักจะพบว่ามันเป็นสัญลักษณ์เชื่อมโยงซึ่งกันและกันดังนั้นหากคุณมี libfoo.so เวอร์ชัน 1.1 คุณจะมีไฟล์ libfoo.so.1.0 จริง และ symlink foo.so และ foo.so.1 ชี้ไปที่ libfoo.so.1.0 และถ้าคุณติดตั้งเวอร์ชัน 1.1 โดยไม่ต้องลบอีกอันคุณจะมี libfoo.so.1.1 และ libfoo.so.1 และ libfoo.so จะชี้ไปที่ใหม่ แต่รหัสใด ๆ ที่ต้องการเวอร์ชันที่แน่นอนนั้นสามารถ ใช้ไฟล์ libfoo.so.1.0 รหัสที่พึ่ง API เวอร์ชัน 1 แต่ไม่สนใจว่าจะเป็น 1.0 หรือ 1.1 จะระบุ libfoo.so.1 ในฐานะที่เป็นoripชี้ให้เห็นในความคิดเห็นที่นี้จะอธิบายได้ดีที่http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

ในกรณีของคุณคุณอาจได้รับไปกับ symlinking ไปlibpthread_rt.so.1 libpthread_rt.soไม่มีการรับประกันว่ามันจะไม่ทำลายรหัสของคุณและกินอาหารเย็นทีวีของคุณ


5
... โอ้พระเจ้า .1 เป็นส่วนหนึ่งของชื่อไฟล์ ความคิดใดมันหมายความว่าอย่างไร
zaratustra

orip สมควรได้รับ +1 สำหรับลิงก์นั้น หากคุณไม่สนใจ @orip ฉันต้องการใส่คำตอบลงในลิงก์หรือไม่
Paul Tomblin

@PaulTomblin ฉันได้รับข้อผิดพลาดที่คล้ายกันในขณะที่ซ่อมด้วง คุณช่วยฉันได้ไหม คำถามนี้ -> askubuntu.com/questions/123275/cant-repair-grub/…
Eray

@ TomNysetvold และ Paul ใช่ - เป็นเอกสารเดียวกัน
orip

ฉันเจอข้อมูลที่ไม่ดีและการแก้ปัญหาวงเวียนในการค้นหาคำตอบนี้ มีบางอย่างในตัวฉันบอกให้ฉันค้นหาต่อไปจนกว่าฉันจะพบโซลูชันคำสั่งเดียว
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/Shared-L ไลบรารี.html


3
คำตอบดังกล่าวข้างต้นมีความชัดเจนขอบคุณมากก่อนอื่น ฉันลองทำสิ่งนี้ใน Eclipse CDT Project Path (Lubuntu) / Debug $ echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "/home/akhil/HDE/x86.linux/lib" นี่คือที่ที่ ห้องสมุดของฉันสามารถใช้งานได้จริง แต่ฉันก็ยังได้รับข้อผิดพลาดเดียวกัน ข้อเสนอแนะใด ๆ !
nahasapeemapetilon

12
ลองคำสั่ง "ldconfig" หลังจากส่งออกห้องสมุดของคุณ คุณอาจต้องดำเนินการคำสั่งนี้เป็น "sudo"
XOR

5
คำสั่งทั้งหมดในขั้นตอน (1) สามารถทำได้โดยfindลำพัง:find / -name the_name_of_the_file.so
wbadart

3
ฉันเชื่อว่าLD_LIBRARY_PATHควรชี้ไปที่ไดเรกทอรีที่มีpath.so.somethingไม่ใช่path.so.somethingตัวของมันเอง
gerrit

2
ทำตามคำสั่งของคุณทีละขั้นตอนแก้ไขปัญหาของฉัน! ขอบคุณตัน!
Fisher Coder

156

นี่คือวิธีแก้ปัญหาบางประการที่คุณสามารถลองได้:

ldconfig

ในฐานะที่เป็น AbiusX ชี้: หากคุณติดตั้งเพียงแค่ตอนนี้ห้องสมุดคุณอาจเพียงแค่ต้องทำงานldconfig

sudo ldconfig

ldconfig สร้างลิงก์และแคชที่จำเป็นไปยังไลบรารีที่แชร์ล่าสุดที่พบในไดเรกทอรีที่ระบุในบรรทัดคำสั่งในไฟล์ /etc/ld.so.conf และในไดเรกทอรีที่เชื่อถือได้ (/ lib และ / usr / lib)

โดยปกติตัวจัดการแพคเกจของคุณจะดูแลสิ่งนี้เมื่อคุณติดตั้งไลบรารีใหม่ แต่ไม่เสมอไปและจะไม่เจ็บในการรัน ldconfig แม้ว่านั่นจะไม่ใช่ปัญหาของคุณก็ตาม

แพคเกจ Dev หรือรุ่นผิด

หากไม่ได้ผลฉันจะตรวจสอบคำแนะนำของ Paulและค้นหาไลบรารี่รุ่น "-dev" ห้องสมุดหลายแห่งถูกแบ่งออกเป็นแพ็คเกจ dev และไม่ใช่แพ็คเกจ คุณสามารถใช้คำสั่งนี้เพื่อค้นหา:

apt-cache search <libraryname>

สิ่งนี้สามารถช่วยได้หากคุณติดตั้งไลบรารีเวอร์ชันที่ไม่ถูกต้อง บางไลบรารีมีการเผยแพร่ในเวอร์ชันต่าง ๆ พร้อมกันเช่น Python

ที่ตั้งห้องสมุด

หากคุณแน่ใจว่ามีการติดตั้งแพ็คเกจที่ถูกต้องและ ldconfig ไม่พบแพ็คเกจดังกล่าวอาจอยู่ในไดเรกทอรีที่ไม่ได้มาตรฐาน โดยค่าเริ่มต้น ldconfig มองใน/lib, /usr/libและไดเรกทอรีที่ระบุไว้ในและ/etc/ld.so.conf $LD_LIBRARY_PATHถ้าห้องสมุดของคุณเป็นที่อื่นคุณสามารถเพิ่มไดเรกทอรีบนเส้นของตัวเองใน/etc/ld.so.confท้ายเส้นทางห้องสมุดเพื่อหรือย้ายห้องสมุดลง$LD_LIBRARY_PATH จากนั้นเรียก/usr/libldconfig

ในการค้นหาว่าห้องสมุดอยู่ที่ใด

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 / local / lib? นั่นทำให้ฉันเลิกอาชีพหลายต่อหลายครั้งและเสียเวลาหลายชั่วโมง
DarenW

@DarenW สำหรับฉันทำงานกับ / usr / local / lib Ubuntu 14.04 LTS
gon1332

การเพิ่ม.confไฟล์ของตัวเองด้วยเส้นทาง lib ที่ไม่ได้มาตรฐานที่ฉันต้องการ/etc/ld.so.conf.d(ชี้ไปโดย/etc/ld.so.conf) ทำเคล็ดลับ
CivFan

4
+1 เพื่อต้องการเรียกใช้ ldconfig ฉันไม่ได้ใช้ผู้จัดการแพ็คเกจ ฉันต้องรวบรวมจากแหล่งที่มาดังนั้นสิ่งนี้จึงจำเป็น
Jeff

7
นี่คือคำตอบที่แท้จริง
Scott Stensland

53

ฉันมีข้อผิดพลาดที่คล้ายกันฉันสามารถแก้ไขได้โดยให้

sudo ldconfig -v

หวังว่านี่จะช่วยได้


37
Hiya นี่อาจแก้ปัญหาได้ ... แต่มันจะดีถ้าคุณสามารถแก้ไขคำตอบของคุณและให้คำอธิบายเล็ก ๆ น้อย ๆ เกี่ยวกับวิธีการและวิธีการทำงาน :) อย่าลืม - มีกองหน้าใหม่ในกองล้นมากเกินไป และพวกเขาสามารถเรียนรู้สิ่งหนึ่งหรือสองอย่างจากความเชี่ยวชาญของคุณ - สิ่งที่ชัดเจนสำหรับคุณอาจไม่เป็นเช่นนั้นสำหรับพวกเขา
Taryn East

เขาไม่สามารถอธิบายได้ เขาเพิ่งคัดลอกคำตอบของเขา
Jhourlad Estrella

คำตอบที่ซ้ำกัน ... ดูคำตอบเดียวกันด้านบนสร้างขึ้นหนึ่งวันก่อน
Scott Stensland

25

คุณต้องตรวจสอบให้แน่ใจว่าคุณได้ระบุเส้นทางของห้องสมุดระหว่างการเชื่อมโยงเมื่อคุณรวบรวมไฟล์. c ของคุณ:

gcc -I / usr / local / รวม xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / local / lib

ส่วน -Wl, -R บอกไบนารีผลลัพธ์เพื่อค้นหาไลบรารีใน / usr / local / lib ที่รันไทม์ก่อนที่จะพยายามใช้หนึ่งใน / usr / lib /

หวังว่ามันจะช่วยคุณ


3
นี่คือตัวเลือกที่ฉันกำลังมองหา -Wl,-rpath DIRบางทีอาจจะดีกว่า
jrw32982 รองรับ Monica

1
ที่ดี! ฉันประสบปัญหานั้นเมื่อโปรแกรมของฉันรวบรวม cmake สำเร็จ แต่ไม่สามารถเริ่มต้นได้เนื่องจากข้อผิดพลาด คำตอบนั้นได้แก้ไขปัญหาของฉัน
Ivan Talalaev

15

ลองเพิ่มLD_LIBRARY_PATHซึ่งระบุเส้นทางการค้นหาไปยัง~/.bashrcไฟล์ของคุณ

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

มันได้ผล!


13

หน้าอ้างอิง linux.org อธิบายกลไก แต่ไม่อธิบายแรงจูงใจเบื้องหลัง :-(

สำหรับสิ่งนี้ให้ดูที่คู่มือแนะนำซันลิงค์เกอร์และไลบรารี

นอกจากนี้โปรดทราบว่า "การกำหนดรุ่นภายนอก" ส่วนใหญ่ล้าสมัยบน Linux เนื่องจากการกำหนดเวอร์ชันสัญลักษณ์ (ส่วนขยาย GNU) ช่วยให้คุณมีฟังก์ชั่นรุ่นเดียวกันที่เข้ากันไม่ได้หลายรายการของไลบรารีเดียวกัน ส่วนขยายนี้อนุญาตให้ glibc มีรุ่นภายนอกเดียวกัน: 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

ฉันมีข้อผิดพลาดที่คล้ายกันและไม่ได้แก้ไขด้วยการให้ LD_LIBRARY_PATH ใน ~ / .bashrc สิ่งที่แก้ไขปัญหาของฉันคือการเพิ่มไฟล์. config และโหลด ไปที่ terminal a ให้เป็น su

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

เพิ่มเส้นทางไลบรารีของคุณในไฟล์นี้และบันทึก (เช่น: / usr / local / lib) คุณต้องเรียกใช้คำสั่งต่อไปนี้เพื่อเปิดใช้งานเส้นทาง:

ldconfig

ยืนยันเส้นทางห้องสมุดใหม่ของคุณ:

ldconfig -v | less

หากสิ่งนี้แสดงไฟล์ไลบรารีของคุณแสดงว่าคุณพร้อมแล้ว


4

วิธีแก้ไขอื่นที่เป็นไปได้ขึ้นอยู่กับสถานการณ์ของคุณ

หากคุณรู้ว่า libpthread_rt.so.1 เหมือนกับ libpthread_rt.so คุณสามารถสร้าง symlink ได้โดย:

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

จากนั้นls -l /libควรแสดง symlink และสิ่งที่ชี้ไป


4

ฉันมีข้อผิดพลาดนี้เมื่อเรียกใช้แอปพลิเคชันของฉันกับ Eclipse CDT บน Linux x86
ในการแก้ไขปัญหานี้:

  1. ใน Eclipse:

    เรียกใช้ -> เรียกใช้การกำหนดค่า -> สภาพแวดล้อม

  2. กำหนดเส้นทาง

    LD_LIBRARY_PATH=/my_lib_directory_path
    

2

สิ่งที่ฉันต้องทำก็คือวิ่ง:

sudo apt-get install libfontconfig1

ฉันอยู่ในโฟลเดอร์ที่ตั้งอยู่/usr/lib/x86_64-linux-gnuและมันทำงานได้อย่างสมบูรณ์


2

หากคุณใช้งานแอปพลิเคชันของคุณบน Microsoft Windows จำเป็นต้องกำหนดพา ธ ไปยังไลบรารีแบบไดนามิก (.dll) ในตัวแปรสภาพแวดล้อม PATH

หากคุณกำลังรันแอ็พพลิเคชันของคุณบน UNIX ต้องกำหนดพา ธ ไปยังไลบรารีไดนามิก (.so) ในตัวแปรสภาพแวดล้อม LD_LIBRARY_PATH



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 ใน fedora:

dnf reinstall libwbclient

0

ฉันใช้ Ubuntu 18.04

การติดตั้งแพคเกจ "-dev" ที่สอดคล้องกันทำงานได้สำหรับฉัน

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.