Saya telah membangun beberapa perpustakaan dari sumber, dan file-file setelahnya make install
masuk/usr/local/lib
Sebagai contoh, dalam kasus saya, saya memiliki file libodb-2.2.so
yang ada di direktori ini.
Namun ketika saya meluncurkan executable yang telah ditautkan libodb
, saya mendapatkan kesalahan: kesalahan saat memuat pustaka bersama:libodb-2.2.so: cannont open shared object file: No such file or directory.
Apakah ini berarti bahwa saya telah membuat executable saya tidak benar? atau haruskah saya menunjukkan sistem bahwa mungkin ada beberapa lib yang menarik di folder /usr/local/lib
juga?
Saya menggunakan Ubuntu 12.04, kernel Linux 3.2.0-38-generik.
gdb
akan membantu denganlink
masalah, misalnya. Saya benar-benar ingin tahu. Pada mulanya, komentar Anda bagi saya tampaknya tidak ada hubungannya dengan masalah. Tapi saya mungkin salah. Memang saya tidak cukup tahugdb
, dan memuat perpustakaan.Jawaban:
Untuk sesi saat ini, Anda bisa
atau untuk membuat perubahan permanen Anda dapat menambahkan
/usr/local/lib
untuk/etc/ld.so.conf
(atau sesuatu itu termasuk) dan menjalankanldconfig
sebagai root.Jika Anda masih mengalami masalah, menjalankan
ldd [executable name]
akan menunjukkan kepada Anda perpustakaan yang sedang dicari, dan mana yang tidak dapat ditemukan.sumber
man
halaman untukldd(1)
"Dalam kasus biasa, ldd memanggil tautan dinamis standar (lihatld.so(8)
) denganLD_TRACE_LOADED_OBJECTS
variabel lingkungan yang disetel1
, yang menyebabkan tautan tersebut menampilkan dependensi perpustakaan. Perlu diketahui, bagaimanapun, bahwa dalam beberapa keadaan, beberapa versildd
mungkin . mencoba untuk mendapatkan informasi dependensi dengan langsung mengeksekusi program demikian, Anda harus tidak pernah mempekerjakanldd
pada executable tidak dipercaya ., karena ini dapat mengakibatkan eksekusi kode sewenang-wenang A alternatif yang lebih aman ketika berhadapan dengan tidak dipercaya executable adalah: ..."$ objdump -p /path/to/program | grep NEEDED
"-L
dan-rpath
selama kompilasi untuk mengatur jalan menghubungkan pencarian dan runtime path pencarian untuk perpustakaan adalah cara yang benar, sesuai ini pertanyaan dan jawaban.Jika Anda sudah menjalankannya
ldconfig
setelah membangun perpustakaan, teruslah membaca. Jika tidak, baca tentang ldconfig terlebih dahulu./usr/local/lib
mungkin tidak di jalur pustaka yang digunakan ldconfig. Anda bisa melakukan ini:Dan hal-hal tersebut harus ditambahkan ke cache linker, tetapi mungkin lebih baik untuk menambahkan path dengan benar. Pastikan Anda memiliki
/etc/ld.so.conf.d
direktori. Jika demikian tambahkan file (sebut saja "usr-local.conf", atau apa pun), dan masukkan satu baris di dalamnya:Sekarang jalankan
ldconfig
. Jika Anda tidak memiliki direktori ld.so.conf.d, Anda harus memiliki/etc/ld.so.conf
file dan Anda dapat menambahkan baris itu ke akhir.sumber
/etc/ld.so.conf.d
sudoed ldconfig untuk memperhitungkannya dan executable saya dapat mulai sekarang.