Kesalahan Linux saat memuat pustaka bersama: tidak dapat membuka file objek bersama: Tidak ada file atau direktori tersebut

356

Program adalah bagian dari test suite Xenomai, dikompilasi silang dari Linux PC ke Linux + toolchain Xenomai ARM.

# 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                                 

Sunting: OK Saya tidak melihat .1 pada akhirnya adalah bagian dari nama file. Apa artinya itu?

zaratustra
sumber
277
Ini mungkin terjadi jika Anda baru saja menginstal pustaka bersama dan tidak menjalankan ldconfig (8) sesudahnya. Lakukan 'ldconfig', tidak ada salahnya.
AbiusX
25
+1 ke @AbiusX komentar - menjalankan sudo ldconfig (dengan asumsi bahwa perpustakaan sebenarnya di mana mereka seharusnya [/ usr / bin / lib /, / usr / bin / include /, / usr / local / lib / dan / usr / local / include / AFAIK], tolong perbaiki saya jika saya salah) dapat menyelesaikan masalah itu. Bersulang!
AeroCross
Perhatikan bahwa kesalahan ini juga dapat muncul jika izin pada file lib Anda berubah entah bagaimana. Mengubah izin kembali ke 644 menyelesaikannya untuk saya.
Geoffrey H

Jawaban:

140

Pembaruan
Sementara apa yang saya tulis di bawah ini benar sebagai jawaban umum tentang pustaka bersama, saya pikir penyebab paling sering dari jenis pesan ini adalah karena Anda telah menginstal paket, tetapi tidak menginstal versi "-dev" dari paket itu.


Yah, itu tidak bohong - tidak ada libpthread_rt.so.1dalam daftar itu. Anda mungkin perlu mengkonfigurasi ulang dan membangun kembali sehingga tergantung pada perpustakaan yang Anda miliki, atau menginstal apa pun yang disediakan libpthread_rt.so.1.

Secara umum, angka setelah .so adalah nomor versi, dan Anda akan sering menemukan bahwa mereka adalah symlink satu sama lain, jadi jika Anda memiliki versi 1.1 dari libfoo.so, Anda akan memiliki file nyata libfoo.so.1.0, dan symlinks foo.so dan foo.so.1 menunjuk ke libfoo.so.1.0. Dan jika Anda menginstal versi 1.1 tanpa menghapus yang lain, Anda akan memiliki libfoo.so.1.1, dan libfoo.so.1 dan libfoo.so sekarang akan menunjuk ke yang baru, tetapi kode apa pun yang membutuhkan versi yang tepat dapat gunakan file libfoo.so.1.0. Kode yang hanya mengandalkan API versi 1, tetapi tidak peduli apakah itu 1.0 atau 1.1 akan menentukan libfoo.so.1. Seperti yang ditunjukkan oleh orip di komentar, ini dijelaskan dengan baik di http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html .

Dalam kasus Anda, Anda mungkin lolos dari symlinking libpthread_rt.so.1to libpthread_rt.so. Tidak ada jaminan bahwa itu tidak akan merusak kode Anda dan makan malam TV Anda.

Paul Tomblin
sumber
5
... Ya Tuhan, .1 adalah bagian dari nama file. Adakah yang tahu apa artinya itu?
zaratustra
orip layak diberi +1 untuk tautan itu. Jika Anda tidak keberatan, @orip, saya ingin menaruh tautan Anda di jawabannya?
Paul Tomblin
@ PaulTomblin, saya mendapatkan kesalahan serupa saat memperbaiki grub. Bisakah Anda membantu saya tentang ini? Pertanyaan ini -> askubuntu.com/questions/123275/cant-repair-grub/…
Eray
@ TomNysetvold dan Paul, ya - ini dokumen yang sama.
orip
Saya menemukan banyak informasi buruk dan solusi bundaran dalam pencarian saya untuk jawaban ini. Sesuatu dalam diri saya mengatakan kepada saya untuk terus mencari sampai saya menemukan solusi satu perintah.
c ..
327

Perpustakaan Anda adalah perpustakaan yang dinamis. Anda perlu memberi tahu sistem operasi di mana ia dapat menemukannya saat runtime.

Untuk melakukannya, kita perlu melakukan langkah-langkah mudah itu:

(1) Temukan tempat perpustakaan ditempatkan jika Anda tidak mengetahuinya.

sudo find / -name the_name_of_the_file.so

(2) Periksa keberadaan variabel lingkungan path perpustakaan dinamis ( LD_LIBRARY_PATH)

$ echo $LD_LIBRARY_PATH

jika tidak ada yang ditampilkan, tambahkan nilai jalur default (atau tidak jika Anda mau)

$ LD_LIBRARY_PATH=/usr/local/lib

(3) Kami menambahkan jalur keinginan, mengekspornya dan mencoba aplikasi.

Perhatikan bahwa path harus berupa direktori tempat path.so.something. Jadi jika path.so.somethingada di /my_library/path.so.somethingdalamnya harus:

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

sumber: http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html

XOR
sumber
3
Jawaban yang disebutkan di atas sangat jelas, Terima kasih pertama-tama. Saya mencoba melakukan ini di Eclipse CDT Project Path (Lubuntu) saya. / Debug $ echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "/home/akhil/HDE/x86.linux/lib" ini adalah tempat perpustakaan saya sebenarnya tersedia bahkan, tetapi saya masih mendapatkan kesalahan yang sama. Ada saran!
nahasapeemapetilon
12
Coba perintah "ldconfig" setelah mengekspor perpustakaan Anda. Anda mungkin perlu menjalankan perintah ini sebagai "sudo".
XOR
5
Semua perintah dalam langkah (1) dapat diselesaikan dengan findsendiri:find / -name the_name_of_the_file.so
wbadart
3
Saya percaya LD_LIBRARY_PATHharus menunjuk ke direktori yang berisi path.so.something, bukan ke path.so.somethingdirinya sendiri.
gerrit
2
Mengikuti perintah Anda selangkah demi selangkah menyelesaikan masalah saya! Terima kasih banyak!
Fisher Coder
156

Berikut adalah beberapa solusi yang dapat Anda coba:

ldconfig

Seperti yang ditunjukkan AbiusX: Jika Anda baru saja menginstal perpustakaan, Anda mungkin hanya perlu menjalankan ldconfig .

sudo ldconfig

ldconfig membuat tautan dan cache yang diperlukan ke pustaka bersama terbaru yang ditemukan di direktori yang ditentukan pada baris perintah, di file /etc/ld.so.conf, dan di direktori tepercaya (/ lib dan / usr / lib).

Biasanya manajer paket Anda akan menangani hal ini ketika Anda menginstal perpustakaan baru, tetapi tidak selalu, dan tidak ada salahnya untuk menjalankan ldconfig bahkan jika itu bukan masalah Anda.

Paket pengembangan atau versi yang salah

Jika itu tidak berhasil, saya juga akan memeriksa saran Paul dan mencari versi "-dev" dari perpustakaan. Banyak perpustakaan dipecah menjadi paket dev dan non-dev. Anda dapat menggunakan perintah ini untuk mencarinya:

apt-cache search <libraryname>

Ini juga dapat membantu jika Anda hanya menginstal versi perpustakaan yang salah. Beberapa perpustakaan diterbitkan dalam versi yang berbeda secara bersamaan, misalnya, Python.

Lokasi perpustakaan

Jika Anda yakin paket yang tepat sudah diinstal, dan ldconfig tidak menemukannya, mungkin saja berada di direktori yang tidak standar. Secara default, ldconfig mencari di /lib,/usr/lib , dan direktori yang tercantum dalam /etc/ld.so.confdan $LD_LIBRARY_PATH. Jika pustaka Anda berada di tempat lain, Anda bisa menambahkan direktori pada barisnya sendiri /etc/ld.so.conf, menambahkan jalur pustaka $LD_LIBRARY_PATH, atau memindahkan pustaka /usr/lib. Kemudian jalankan ldconfig.

Untuk mencari tahu di mana perpustakaan itu, coba ini:

sudo find / -iname *libraryname*.so*

(Ganti librarynamedengan nama perpustakaan Anda)

Jika Anda pergi $LD_LIBRARY_PATHrute, Anda ingin memasukkannya ke ~/.bashrcfile Anda sehingga akan berjalan setiap kali Anda login:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library
amo
sumber
3
Secara default, / lib dan / usr / lib tetapi tidak / usr / local / lib? Itu telah membuat saya terlempar beberapa kali selama karier dan menghabiskan banyak waktu.
DarenW
@ DarenW Bagi saya bekerja dengan / usr / local / lib. Ubuntu 14,04 LTS.
gon1332
Menambahkan .conffile saya sendiri dengan lib path non-standar yang saya perlukan /etc/ld.so.conf.d(ditunjukkan oleh /etc/ld.so.conf) melakukan trik.
CivFan
4
+1 karena harus menjalankan ldconfig. Saya tidak menggunakan manajer paket. Saya harus mengkompilasi dari sumber, jadi ini perlu.
Jeff
7
inilah jawaban sebenarnya
Scott Stensland
53

Saya memiliki kesalahan yang sama, saya bisa mengatasinya dengan memberi,

sudo ldconfig -v

Semoga ini membantu.

Bithin Alangot
sumber
37
Hai, ini mungkin bisa menyelesaikan masalah ... tapi alangkah baiknya jika Anda bisa mengedit jawaban Anda dan memberikan sedikit penjelasan tentang bagaimana dan mengapa ia bekerja :) Jangan lupa - ada banyak pemula di Stack overflow, dan mereka bisa belajar satu atau dua dari keahlian Anda - yang jelas bagi Anda mungkin tidak demikian bagi mereka.
Taryn East
Dia tidak akan bisa menjelaskannya. Dia hanya menyalin jawabannya.
Jhourlad Estrella
duplikat jawaban ... lihat jawaban yang sama di atas dibuat sehari sebelumnya
Scott Stensland
25

Anda perlu memastikan bahwa Anda menentukan jalur pustaka selama menautkan saat Anda mengompilasi file .c Anda:

gcc -I / usr / local / termasuk xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / local / lib

Bagian -Wl, -R memberitahu biner yang dihasilkan untuk juga mencari perpustakaan di / usr / local / lib saat runtime sebelum mencoba menggunakan yang ada di / usr / lib /

Semoga ini bisa membantu Anda.

TaoCHEN92
sumber
3
Ini adalah opsi yang saya cari. Mungkin lebih baik -Wl,-rpath DIR.
jrw32982 mendukung Monica
1
Bagus! Saya menghadapi masalah itu ketika program saya berhasil dikompilasi dengan cmake tetapi tidak dapat memulai karena kesalahan. Jawaban itu menyelesaikan masalah saya
Ivan Talalaev
15

Coba tambahkan LD_LIBRARY_PATH, yang menunjukkan jalur pencarian, ke ~/.bashrcfile Anda

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

Berhasil!

Ankit Marothi
sumber
13

Halaman referensi linux.org menjelaskan mekanisme, tetapi tidak menjelaskan motivasi di baliknya :-(

Untuk itu, lihat Sun Linker dan Libraries Guide

Selain itu, perhatikan bahwa "versi eksternal" sebagian besar sudah usang di Linux, karena versi simbol (ekstensi GNU) memungkinkan Anda untuk memiliki beberapa versi yang tidak kompatibel dengan fungsi yang sama untuk hadir di perpustakaan tunggal. Ekstensi ini memungkinkan glibc untuk memiliki versi eksternal yang sama: libc.so.6selama 10 tahun terakhir.

Mempekerjakan bahasa Rusia
sumber
7
cd /home/<user_name>/
sudo vi .bash_profile

tambahkan baris ini di akhir

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

Saya memiliki kesalahan yang sama dan tidak diperbaiki dengan memberikan LD_LIBRARY_PATH di ~ / .bashrc. Apa yang memecahkan masalah saya adalah dengan menambahkan file .conf dan memuatnya. Pergi ke terminal dan su.

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

Tambahkan jalur pustaka Anda di file ini dan simpan. (Mis .: / usr / local / lib). Anda harus menjalankan perintah berikut untuk mengaktifkan jalur:

ldconfig

Verifikasi Jalur Perpustakaan Baru Anda:

ldconfig -v | less

Jika ini menunjukkan file perpustakaan Anda, maka Anda bisa melakukannya.

Anand Paul
sumber
4

Solusi lain yang mungkin tergantung pada situasi Anda.

Jika Anda tahu bahwa libpthread_rt.so.1 sama dengan libpthread_rt.so maka Anda dapat membuat symlink dengan:

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

Maka ls -l /libsekarang harus menunjukkan symlink dan apa yang ditunjukkannya.

ALM865
sumber
4

Saya mengalami kesalahan ini ketika menjalankan aplikasi saya dengan Eclipse CDT di Linux x86.
Untuk memperbaikinya:

  1. Dalam Eclipse:

    Jalankan sebagai -> Jalankan konfigurasi -> Lingkungan

  2. Atur jalurnya

    LD_LIBRARY_PATH=/my_lib_directory_path
    
Michael Fayad
sumber
2

Yang harus saya lakukan adalah menjalankan:

sudo apt-get install libfontconfig1

Saya berada di folder yang terletak di /usr/lib/x86_64-linux-gnudan itu bekerja dengan sempurna.

Jonny
sumber
2

Jika Anda menjalankan aplikasi di Microsoft Windows, jalur ke perpustakaan dinamis (.dll) harus ditentukan dalam variabel lingkungan PATH.

Jika Anda menjalankan aplikasi Anda di UNIX, jalur ke perpustakaan dinamis Anda (.so) perlu ditentukan dalam variabel lingkungan LD_LIBRARY_PATH.

Rubens Gomes
sumber
1

coba pasang sudo lib32z1

sudo apt-get install lib32z1

zajac.m2
sumber
1

Kesalahan terjadi karena sistem tidak dapat merujuk ke file perpustakaan yang disebutkan. Ambil langkah-langkah berikut:

  1. Running locate libpthread_rt.so.1akan menampilkan lintasan semua file dengan nama itu. Anggaplah jalan itu /home/user/loc.
  2. Salin path dan jalankan cd home/USERNAME. Ganti USERNAME dengan nama pengguna aktif saat ini yang Anda inginkan untuk menjalankan file.
  3. Jalankan vi .bash_profiledan di akhir LD_LIBRARY_PATHparameter, tepat sebelum ., tambahkan baris /lib://home/usr/loc:.. Simpan file.
  4. Tutup terminal dan mulai ulang aplikasi. Itu harus dijalankan.
vipin nair
sumber
0

Saya mendapat kesalahan ini dan saya pikir itu alasan Anda sama

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

Coba ini. Perbaiki izin pada file:

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

“Sudo su” untuk mendapatkan izin pada sistem file Anda.

Mohamad Osama
sumber
0

Saya mendapat kesalahan ini dan saya pikir itu alasan Anda sama

galat saat memuat pustaka bersama: libnw.so: tidak dapat membuka file objek bersama: Tidak ada file atau direktori tersebut

Coba ini. Perbaiki izin pada file:

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

masalah serupa ditemukan di sini: https://bugzilla.redhat.com/show_bug.cgi?id=1456202 Saya sudah mencoba solusi yang disebutkan dan itu benar-benar berfungsi.

Solusi dalam pertanyaan sebelumnya mungkin berhasil. Tapi saya pikir ini adalah cara mudah untuk memperbaikinya. Coba instal ulang paket libwbclient di fedora:

dnf reinstall libwbclient
Mohamed Ain Samet
sumber
0

Saya menggunakan Ubuntu 18.04

Menginstal paket "-dev" yang sesuai berhasil untuk saya,

sudo apt install libgconf2-dev

Saya mendapatkan kesalahan di bawah ini sampai saya menginstal paket di atas,

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
prabhugs
sumber