Di mana Ubuntu mencari perpustakaan bersama?

24

Ketika saya menjalankan proses yang menautkan ke pustaka bersama saat runtime (ditautkan saat proses dimulai, tidak ditautkan nanti dengan dlload()), di mana ia mencari .sofile pustaka bersama ( ) selain itu LD_LIBRARY_PATH?

Latar Belakang:

Saya memiliki beberapa kode C ++ yang saya tulis yang menggunakan pustaka pihak ketiga tertentu. Saya telah menginstal perpustakaan dan mengkompilasi kode saya pada dua platform yang berbeda, baik Ubuntu tetapi versi yang berbeda, dan versi gcc yang berbeda juga. Perpustakaan dikompilasi dan diinstal dari sumber, dan terletak di /usr/local/libkedua platform. Ketika saya mengkompilasi kode saya, saya menautkan dengan pkg-config --libsparameter untuk perpustakaan pihak ketiga dan saya telah memverifikasi yang pkg-config --libsmengembalikan hal yang sama persis di kedua platform.

Kode saya berhasil dikompilasi di kedua platform, dan LD_LIBRARY_PATHtidak didefinisikan (atau didefinisikan sebagai kosong:) ""di kedua platform. Namun, ketika saya menjalankannya di satu platoform berfungsi dengan baik, dan di sisi lain saya mendapatkan kesalahan ini:

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

Lucunya, orang-orang yang tidak bekerja adalah lebih baru versi Ubuntu dan gcc. : /

Jadi saya mencoba mencari tahu bagaimana orang yang bekerja dapat menemukan perpustakaan, sehingga saya dapat membuat yang rusak menemukan perpustakaan dengan cara yang sama. (yaitu, tanpa pengaturan LD_LIBRARY_PATH)

Memperbarui:

Ini hasil saya dari cat /etc/ld.so.conf.d/*

... pada sistem (lama) yang berfungsi:

/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

... pada sistem yang rusak (lebih baru):

# 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
Dave Lillethun
sumber
1
Saya pikir tempat-tempat itu didefinisikan /etc/ld.so.conf.d/*.conf, tetapi saya tidak yakin akan hal itu.
Salem
Sepertinya itu, tetapi lihat pembaruan saya ke OQ untuk isi dari file-file itu ... Jadi sepertinya ia harus menemukan /usr/local/lib/libthrift-0.9.0.sotetapi tetap saja memberikan kesalahan error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory... Apakah ada alasan tidak mengambil direktori dari /etc/ld.so.conf.d/*.conf?
Dave Lillethun
3
Coba jalankan sudo ldconfig -vseperti yang disarankan di bawah ini. Jika masih tidak berfungsi, perbarui pertanyaan Anda dengan output dari ldd /path/to/your/application.
Salem

Jawaban:

29

Seluruh jalur bisnis ini terkait dengan sesuatu yang disebut multi-lengkungan. Pada dasarnya ini memungkinkan Anda untuk memiliki perpustakaan 32bit dan 64bit pada sistem yang sama.

Setelah Anda menyalin file, apakah Anda menjalankan ldconfig?

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.
Matt H
sumber
Saya berlari sudo ldconfigdan itu memperbaiki masalah! (Tidak perlu mengkompilasi ulang kode saya atau apa pun ...) Saya hanya ingin mengerti, meskipun ... Anda berkata "Setelah Anda menyalin file," tapi saya tidak menyalin file. Apakah maksud Anda setelah saya membangun & menginstal perpustakaan, atau setelah saya menyusun program saya?
Dave Lillethun
Setelah Anda menempatkannya di tempat Anda meletakkannya. Pada dasarnya cache perpustakaan dibangun. Saya pikir me-reboot juga dapat membangun kembali cache.
Matt H
Saya mungkin salah, tapi saya percaya saya telah reboot sejak menginstal perpustakaan ... Namun, sudo ldconfiglakukan triknya. Apakah ini sesuatu yang sering dijalankan secara otomatis oleh perpustakaan Anda sebagai bagian dari instalasi mereka, dan ini karena suatu alasan tidak? Hanya ingin tahu mengapa saya tidak "biasanya" harus melakukan ini, tetapi hanya dalam kasus ini ...
Dave Lillethun
Biasanya instalasi paket akan menjalankan ldconfig selama proses instalasi, saya pikir. Mungkin versi di distro baru Anda tidak melakukannya karena suatu alasan.
Matt H
1

Informasi yang terkandung dalam pertanyaan di atas DAN pertama (dan hanya ATT) jawaban , membantu saya menyelesaikan * * masalah saya yang serupa di WSL Ubuntu (pada Win10 64)!

Dalam kasus saya , executable tidak dapat menemukan perpustakaan. Saya akhirnya menyadari bahwa baru-dibuat perpustakaan mendapat posisi di /usr/lib64, tapi garis multi-lengkungan /etc/ld.so.conf.d/x86_64-linux-gnu.conf itu tidak termasuk direktori tersebut.

Jadi saya berlari

sudo ldconfig /usr/lib64

dan akhirnya memperbaikinya. (menjalankannya sendiri tanpa parameter direktori tidak membuatnya 'ajaib' menemukan perpustakaan BTW.) Tidak jelas apakah 'restart' bash WSL saya membantu ... Saya pikir itu bahkan tidak diperlukan.

Jordan Gee
sumber
Hal yang sama terjadi pada saya dengan / usr / local / lib /. Saya membuat file /etc/ld.so.conf.d/usr-local.confdan kemudian berlari sudo ldconfigtanpa efek - perpustakaan di direktori itu tidak ditemukan oleh loader. Setelah menjalankan sudo ldconfig /usr/local/libsemuanya bekerja dengan baik.
Josh Milthorpe