Ketika saya menjalankan proses yang menautkan ke pustaka bersama saat runtime (ditautkan saat proses dimulai, tidak ditautkan nanti dengan dlload()
), di mana ia mencari .so
file 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/lib
kedua platform. Ketika saya mengkompilasi kode saya, saya menautkan dengan pkg-config --libs
parameter untuk perpustakaan pihak ketiga dan saya telah memverifikasi yang pkg-config --libs
mengembalikan hal yang sama persis di kedua platform.
Kode saya berhasil dikompilasi di kedua platform, dan LD_LIBRARY_PATH
tidak 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
sumber
/etc/ld.so.conf.d/*.conf
, tetapi saya tidak yakin akan hal itu./usr/local/lib/libthrift-0.9.0.so
tetapi tetap saja memberikan kesalahanerror 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
?sudo ldconfig -v
seperti yang disarankan di bawah ini. Jika masih tidak berfungsi, perbarui pertanyaan Anda dengan output darildd /path/to/your/application
.Jawaban:
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?
sumber
sudo ldconfig
dan 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?sudo ldconfig
lakukan 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 ...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.
sumber
/etc/ld.so.conf.d/usr-local.conf
dan kemudian berlarisudo ldconfig
tanpa efek - perpustakaan di direktori itu tidak ditemukan oleh loader. Setelah menjalankansudo ldconfig /usr/local/lib
semuanya bekerja dengan baik.