Paylaşılan kitaplıkları yüklerken Linux hatası: paylaşılan nesne dosyası açılamıyor: Böyle bir dosya veya dizin yok


356

Program, Linux PC'den Linux + Xenomai ARM araç zincirine çapraz olarak derlenmiş Xenomai test paketinin bir parçasıdır.

# 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                                 

Düzenleme: Tamam Sonunda .1 dosya adının bir parçası olduğunu fark etmedi. yine de ne anlama geliyor?


278
Bu, yakın zamanda paylaşılan bir kitaplık yüklediyseniz ve daha sonra ldconfig (8) çalıştırmadıysanız olabilir. 'Ldconfig' yapın, içinde zarar yok.
AbiusX

26
+1 to @AbiusX comment - sudo ldconfig çalıştırıyor (kütüphanelerin aslında [/ usr / bin / lib /, / usr / bin / include /, / usr / local / lib / ve / usr / local olması gerektiği varsayılarak) / include / AFAIK], yanılıyorsam lütfen düzeltin) bu sorunu çözebilir. Şerefe!
AeroCross

Bu hatanın, lib dosyanızdaki izinler bir şekilde değiştiğinde de ortaya çıkabileceğini unutmayın. İzinleri 644 olarak değiştirmek benim için çözdü.
Geoffrey H

Yanıtlar:


140

Güncelleme
Aşağıda yazdıklarım paylaşılan kütüphaneler hakkında genel bir cevap olarak doğru olsa da, bu tür mesajların en sık nedeninin bir paket kurmuş olmanız, ancak bu paketin "-dev" sürümünü kurmamış olmanızdan kaynaklandığını düşünüyorum.


Yalan söylemiyor - libpthread_rt.so.1bu listede hiç yok . Muhtemelen, sahip olduğunuz kitaplığa bağlı olması veya sağladığınız her şeyi yüklemesi için yeniden yapılandırmanız ve yeniden oluşturmanız gerekir libpthread_rt.so.1.

Genellikle, .so'dan sonraki sayılar sürüm numaralarıdır ve genellikle birbirlerine sembolik bağlar olduğunu görürsünüz, bu nedenle libfoo.so sürüm 1.1'e sahipseniz, gerçek bir libfoo.so.1.0 dosyanız olacaktır, ve libfoo.so.1.0'ı gösteren foo.so ve foo.so.1 simgeleri. Ve 1.1 sürümünü diğerini kaldırmadan yüklerseniz, bir libfoo.so.1.1'e sahip olacaksınız ve libfoo.so.1 ve libfoo.so şimdi yenisine işaret edecek, ancak tam sürümü gerektiren herhangi bir kod libfoo.so.1.0 dosyasını kullanın. Sadece sürüm 1 API'sine dayanan, ancak 1.0 veya 1.1 olup olmadığı umurumda olmayan libfoo.so.1'i belirtir. Yorumlarda belirtildiği gibi , bu http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html adresinde iyi açıklanmıştır .

Senin durumda, belki sembolik bağlantılarını paçayı libpthread_rt.so.1için libpthread_rt.so. Hayır, ancak kodunuzu kırmayacağınızı ve TV yemeklerinizi yiyemeyeceğinizi garanti etmez.


5
... oh tanrım, .1 dosya adının bir parçası. Bunun anlamı ne?
zaratustra

orip bu bağlantı için +1 değerini hak ediyor. Eğer sakıncası yoksa, @orip, bağlantını cevaba vermek ister miyim?
Paul Tomblin

@PaulTomblin, grub onarılırken benzer hata alıyorum. Bu konuda bana yardım edebilir misin? Bu soru -> askubuntu.com/questions/123275/cant-repair-grub/…
Eray

@TomNysetvold ve Paul, evet - aynı belge.
orip

Bu cevabı araştırmamda birçok kötü bilgi ve dolambaçlı çözüm buldum. İçimdeki bir şey, tek komutlu bir çözüm bulana kadar aramaya devam etmemi söyledi.
c ..

327

Kütüphaneniz dinamik bir kütüphanedir. İşletim sistemine çalışma zamanında nerede bulabileceğini söylemeniz gerekir.

Bunu yapmak için şu kolay adımları izlememiz gerekecek:

(1) Bilmiyorsanız, kitaplığın nereye yerleştirildiğini bulun.

sudo find / -name the_name_of_the_file.so

(2) Dinamik kütüphane yolu ortam değişkeninin ( LD_LIBRARY_PATH) olup olmadığını kontrol edin

$ echo $LD_LIBRARY_PATH

görüntülenecek hiçbir şey yoksa, varsayılan bir yol değeri ekleyin (veya isterseniz)

$ LD_LIBRARY_PATH=/usr/local/lib

(3) Arzu yolunu ekliyoruz, dışa aktarıyoruz ve uygulamayı deniyoruz.

Yolun olduğu dizini olması gerektiğini unutmayın path.so.something. Yani eğer path.so.somethingiçindedir /my_library/path.so.somethingolması gerektiği:

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

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


3
Yukarıda belirtilen cevap çok açıktı, her şeyden önce teşekkürler. Eclipse CDT Proje Yolu (Lubuntu) bunu denedim. / $ Echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "/home/akhil/HDE/x86.linux/lib" burası kütüphanelerim aslında mevcut, ama yine de aynı hatayı alıyorum. Baska öneri!
nahasapeemapetilon

12
Kitaplığınızı dışa aktardıktan sonra bir "ldconfig" komutunu deneyin. Bu komutu "sudo" olarak yürütmeniz gerekebilir.
XOR

5
Adım (1) 'deki tüm komutlar findtek başına gerçekleştirilebilir :find / -name the_name_of_the_file.so
wbadart

3
Ben değil, LD_LIBRARY_PATHiçeren dizini işaret gerekir inanıyorum . path.so.somethingpath.so.something
gerrit

2
Komutlarınızı adım adım takip etmek sorunumu çözdü! Bir ton teşekkürler!
Fisher Coder

156

İşte deneyebileceğiniz birkaç çözüm:

ldconfig

AbiusX'un işaret ettiği gibi: Kütüphaneyi şimdi kurduysanız, ldconfig dosyasını çalıştırmanız gerekebilir .

sudo ldconfig

ldconfig, komut satırında belirtilen dizinlerde, /etc/ld.so.conf dosyasında ve güvenilen dizinlerde (/ lib ve / usr / lib) bulunan en son paylaşılan kitaplıklara gerekli bağlantıları ve önbelleği oluşturur.

Genellikle yeni bir kitaplık yüklediğinizde paket yöneticiniz bununla ilgilenir, ancak her zaman değil ve sorununuz olmasa bile ldconfig'i çalıştırmak zarar vermez.

Dev paketi veya yanlış sürüm

Bu işe yaramazsa, Paul'ün önerisine de göz atar ve kütüphanenin "-dev" sürümünü ararım. Birçok kütüphane dev ve dev olmayan paketlere ayrılmıştır. Aramak için bu komutu kullanabilirsiniz:

apt-cache search <libraryname>

Bu, kitaplığın yanlış sürümünün yüklü olması durumunda da yardımcı olabilir. Bazı kütüphaneler aynı anda farklı versiyonlarda yayınlanır, örneğin, Python.

Kütüphane yeri

Doğru paketin yüklendiğinden eminseniz ve ldconfig paketi bulamadıysa, standart olmayan bir dizinde olabilir. Varsayılan olarak, Ldconfig bakar /lib, /usr/libve dizinleri listelenir /etc/ld.so.confve $LD_LIBRARY_PATH. Kütüphaneniz başka bir yerdeyse, dizini kendi satırına /etc/ld.so.confekleyebilir, kütüphanenin yolunu ekleyebilir veya kütüphaneyi buraya $LD_LIBRARY_PATHtaşıyabilirsiniz /usr/lib. Sonra koş ldconfig.

Kütüphanenin nerede olduğunu öğrenmek için şunu deneyin:

sudo find / -iname *libraryname*.so*

( librarynameKitaplığınızın adıyla değiştirin )

$LD_LIBRARY_PATHRotaya giderseniz, ~/.bashrcbunu her dosyaya girişinizde çalışacak şekilde dosyanıza koymak istersiniz :

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

3
Varsayılan olarak, / lib ve / usr / lib ama / usr / local / lib? Bu, kariyerim boyunca birkaç kez beni attı ve saatler harcadı.
DarenW

@DarenW Benim için / usr / local / lib ile çalışır. Ubuntu 14.04 LTS.
gon1332

.confİhtiyacım olan standart olmayan lib yolları ile kendi dosyaları eklemek /etc/ld.so.conf.d(işaret ettiğim /etc/ld.so.conf) hile yaptı.
CivFan

4
Ldconfig komutunu çalıştırmanız gerektiğinden +1. Paket yöneticisi kullanmıyordum. Kaynaktan derlemek zorunda kaldım, bu yüzden gerekliydi.
Jeff

7
gerçek cevap bu
Scott Stensland

53

Benzer bir hatayla karşılaştım, bunu vererek çözebilirim,

sudo ldconfig -v

Bu yardımcı olur umarım.


37
Hiya, bu sorunu iyi çözebilir ... ama cevabınızı düzenleyebilir ve nasıl ve neden işe yaradığına dair biraz açıklama yapabilirseniz iyi olur :) Unutmayın - Stack overflow'da yeni başlayanlar var, ve uzmanlığınızdan bir iki şey öğrenebilirler - sizin için açık olan şey onlar için böyle olmayabilir.
Taryn East

Bunu açıklayamayacak. Sadece cevabını kopyaladı.
Jhourlad Estrella

yinelenen cevap ... yukarıdaki bir gün önce aynı cevaba bakınız
Scott Stensland

25

.C dosyanızı derlerken bağlantı sırasında kütüphane yolunu belirttiğinizden emin olmanız gerekir:

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

-Wl, -R bölümü, ortaya çıkan ikili dosyaya, / usr / lib / dizinindeki dosyayı kullanmaya çalışmadan önce çalışma zamanında / usr / local / lib içindeki kitaplığı aramasını söyler.

Umarım size yardımcı olur.


3
Aradığım seçenek buydu. Belki daha iyi olur -Wl,-rpath DIR.
jrw32982 Monica

1
harika! Programım başarıyla cmake ile derlendi ama hata nedeniyle başlatılamadı bu sorunla karşı karşıya. Bu cevap sorunumu çözdü
Ivan Talalaev

15

Dosyanıza LD_LIBRARY_PATHarama yollarını gösteren eklemeyi deneyin~/.bashrc

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

İşe yarıyor!


13

Linux.org referans sayfası mekaniği açıklar, ancak arkasındaki motivasyonu açıklamaz :-(

Bunun için bkz. Sun Linker ve Kütüphaneler Kılavuzu

Ek olarak, "harici sürüm oluşturma" nın Linux'ta büyük ölçüde kullanılmadığına dikkat edin, çünkü sembol sürümlendirme (bir GNU uzantısı), aynı işlevin birden çok uyumsuz sürümünün tek bir kitaplıkta bulunmasına izin verir. Bu uzantı, glibc'nin aynı harici sürüme sahip olmasına izin verdi: libc.so.6son 10 yıldır.


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

bu satırları sonuna ekle

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

5

Benzer bir hata vardı ve ~ / .bashrc içinde LD_LIBRARY_PATH vererek düzeltmek vermedi. Sorunumu çözen, .conf dosyası ekleyerek ve yükleyerek. Su be terminaline git.

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

Kütüphane yolunuzu bu dosyaya ekleyin ve kaydedin. (Örneğin: / usr / local / lib). Yolu etkinleştirmek için aşağıdaki komutu çalıştırmanız gerekir:

ldconfig

Yeni Kütüphane Yolunuzu Doğrulayın:

ldconfig -v | less

Bu kütüphane dosyalarınızı gösteriyorsa, gitmeye hazırsınız demektir.


4

Durumunuza bağlı olarak bir başka olası çözüm.

Libpthread_rt.so.1'in libpthread_rt.so ile aynı olduğunu biliyorsanız, aşağıdakileri yaparak bir symlink oluşturabilirsiniz:

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

Sonra ls -l /libartık sembolik ve neyi işaret göstermelidir.


4

Linux x86 üzerinde Eclipse CDT ile uygulamam çalışırken bu hatayla karşılaştım.
Bunu düzeltmek için:

  1. Tutulmada:

    Farklı çalıştır -> Yapılandırmaları çalıştır -> Çevre

  2. Yolu ayarla

    LD_LIBRARY_PATH=/my_lib_directory_path
    

2

Tek yapmam gereken koşmaktı:

sudo apt-get install libfontconfig1

Ben de bulunan klasördeydim /usr/lib/x86_64-linux-gnuve mükemmel çalıştı.


2

Uygulamanızı Microsoft Windows üzerinde çalıştırıyorsanız, PATH ortam değişkeninde dinamik kitaplıkların (.dll) yolunun tanımlanması gerekir.

Uygulamanızı UNIX üzerinde çalıştırıyorsanız, dinamik kitaplıklarınızın (.so) yolunun LD_LIBRARY_PATH ortam değişkeninde tanımlanması gerekir.


1

sudo lib32z1 yüklemeyi deneyin

sudo apt-get install lib32z1


1

Hata, sistem belirtilen kitaplık dosyasına başvuramadığı için oluşur. Aşağıdaki adımları uygulayın:

  1. Çalıştırıldığında locate libpthread_rt.so.1, bu ada sahip tüm dosyaların yolu listelenir. Bir yol olduğunu varsayalım /home/user/loc.
  2. Yolu kopyalayın ve çalıştırın cd home/USERNAME. USERNAME adlı dosyayı, dosyayı çalıştırmak istediğiniz geçerli etkin kullanıcının adıyla değiştirin.
  3. Çalıştırın vi .bash_profileve LD_LIBRARY_PATHparametrenin sonuna , hemen önce .satırı ekleyin /lib://home/usr/loc:.. Dosya 'yı kaydet.
  4. Terminali kapatın ve uygulamayı yeniden başlatın. Çalışmalı.

0

Bu hatayı aldım ve bence seninkiyle aynı sebep

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

Bunu dene. Dosyalardaki izinleri düzeltin :

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

Dosya sisteminizde izin almak için “sudo su”.


0

Bu hatayı aldım ve bence seninkiyle aynı sebep

kütüphaneler yüklenirken hata oluştu: libnw.so: paylaşılan nesne dosyasını açamıyor: Böyle bir dosya veya dizin yok

Bunu dene. Dosyalardaki izinleri düzeltin:

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


0

Ubuntu 18.04 kullanıyorum

Karşılık gelen "-dev" paketini kurmak benim için çalıştı,

sudo apt install libgconf2-dev

Yukarıdaki paketi yükleyene kadar aşağıdaki hatayı alıyordum,

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.