Ubuntu paylaşılan kütüphaneleri nerede arar?


24

Çalışma zamanında paylaşılan bir kütüphaneye bağlanan bir işlemi çalıştırdığımda (işlem başladığında bağlantılı, daha sonra bağlanmayacak şekilde dlload()), .sobaşka bir paylaşılan kütüphane ( ) dosyasını nerede arar LD_LIBRARY_PATH?

Arka fon:

Belirli bir üçüncü taraf kütüphanesini kullanan, yazdığım bazı C ++ kodlarım var. Kütüphaneyi kurdum ve kodumu hem Ubuntu hem de farklı sürümler ve farklı gcc sürümleri olmak üzere iki farklı platformda derledim. Kütüphane derlenmiş ve kaynaktan kurulmuş ve /usr/local/libher iki platformda da bulunmaktadır. Kodumu derlerken pkg-config --libs, üçüncü taraf kütüphanesinin parametrelerine bağlanır ve pkg-config --libsaynı şeyi her iki platformda da aynı şekilde döndürdüğümü doğrularım.

Kodum her iki platformda da başarıyla derleniyor ve her iki platformda LD_LIBRARY_PATHtanımlanmadı (veya boş olarak tanımlandı "":). Ancak, bir platoform üzerinde çalıştırdığımda iyi çalışıyor ve diğerinde bu hatayı alıyorum:

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

Tuhaftır, olanları değil işi olduğunu daha yeni Ubuntu ve gcc sürümü. : /

Bu yüzden çalışan kişinin kütüphaneyi nasıl bulabildiğini bulmaya çalışıyorum, böylece bozuk olanı kütüphaneyi aynı şekilde bulmasını sağlayabiliyorum. (yani, ayar olmadan LD_LIBRARY_PATH)

Güncelleştirme:

İşte benim çıktım cat /etc/ld.so.conf.d/*

... çalışan (eski) sistemde:

/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

... kırık (daha yeni) sistemde:

# 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
Bence bu yerler belli /etc/ld.so.conf.d/*.conf, ama bundan emin değilim.
Salem

Öyle gözüküyor, ancak bu dosyaların içeriğiyle ilgili olarak OQ güncellememe bakın ... Bulması gereken gibi görünüyor /usr/local/lib/libthrift-0.9.0.soama yine de hata veriyor error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory... Dizini almamasının bir nedeni var mı /etc/ld.so.conf.d/*.conf?
Dave Lillethun

3
sudo ldconfig -vAşağıda önerildiği şekilde çalıştırmayı deneyin . Hala işe yaramazsa sorunuzu çıktıyla güncelleyin ldd /path/to/your/application.
Salem

Yanıtlar:


29

Bütün bu yol işi, çoklu kemer adı verilen bir şeyle ilgilidir. Temelde, aynı sistemde 32bit ve 64bit kütüphanelere sahip olmanıza izin vermek.

Dosyayı kopyaladıktan sonra, ldconfig'i çalıştırdın mı?

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.

Koştum sudo ldconfigve bu sorunu çözdü! (Kodumu veya herhangi bir şeyi yeniden derlememe gerek yoktu ...) Sadece şunu söylemek istiyorum, ama ... "Dosyayı kopyaladıktan sonra" dedin ama bir dosyayı kopyalamadım. Kütüphaneyi kurduktan ve kurduktan sonra mı, yoksa programımı derledikten sonra mı?
Dave Lillethun

Yerine yerleştirdikten sonra. Temel olarak bir kütüphane önbelleği oluşturulmuştur. Yeniden başlatmanın da önbelleği yeniden oluşturabileceğini düşünüyorum.
Matt H

Yanılıyor olabilirim, ama kütüphaneyi kurduğumdan beri yeniden başlatıldığına inanıyorum sudo ldconfig. Bu, kütüphanelerin sıklıkla sizin yüklemenizin bir parçası olarak sizin için otomatik olarak çalıştırıldığı bir şey midir? Sadece "normalde" neden bunu yapmak zorunda olmadığımı merak ediyorum, ama sadece bu durumda yaptım ...
Dave Lillethun

Genellikle paket kurulum bence yükleme işlemi sırasında ldconfig çalışır. Belki de yeni dağıtımınızdaki sürüm bir sebepten dolayı yapmıyordur.
Matt H

1

Yukarıdaki sorudaki VE ilk (ve yalnızca ATT) yanıtındaki bilgiler , WSL Ubuntu'daki (Win10 64'te) benim * benzer bir * sorunumu çözmeme yardımcı oldu !

Benim durumumda çalıştırılabilir bir kütüphane bulamadı. Ben sonuçta yeni yapılan kütüphane konumlandırılmış var olduğunu fark /usr/lib64, ancak bir çok kemer hatları /etc/ld.so.conf.d/x86_64-linux-gnu.conf vermedi değil o dizini bulunur.

Bu yüzden koştum

sudo ldconfig /usr/lib64

ve nihayet düzeltti. (Dizin parametresi olmadan tek başına çalıştırma, 'sihirli' olarak BTW kütüphanelerini bulmasını sağlamadı.) WSL bash'imin 'yeniden başlatılması' nın işe yarayıp yaramadığı belli değil.


Aynısı / usr / local / lib / ile başıma geldi. Bir dosya yarattım /etc/ld.so.conf.d/usr-local.confve sudo ldconfigetkisiz olarak koştum - bu dizindeki kütüphaneler yükleyici tarafından bulunamadı. Çalıştırdıktan sonra sudo ldconfig /usr/local/libher şey iyi çalıştı.
Josh Milthorpe
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.