Gunakan perpustakaan bersama di / usr / local / lib

59

Saya telah membangun beberapa perpustakaan dari sumber, dan file-file setelahnya make installmasuk/usr/local/lib

Sebagai contoh, dalam kasus saya, saya memiliki file libodb-2.2.soyang 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/libjuga?

Saya menggunakan Ubuntu 12.04, kernel Linux 3.2.0-38-generik.

Stephane Rolland
sumber
askubuntu.com/questions/165027/… , stackoverflow.com/questions/17889799/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Saya sangat menyarankan Anda membuat hubungan pertemanan yang baik dengan debugger Anda
DDS
@ DDS Saya sarankan Anda menjelaskan lebih banyak. Anda tahu itu adalah situs kolaborasi di sini. Tolong, sebutkan cara yang gdbakan membantu dengan linkmasalah, 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 tahu gdb, dan memuat perpustakaan.
Stephane Rolland
Maaf ... komentar ini seharusnya ditempatkan pada stackoverflow pada pertanyaan pelajar tentang pemrograman C ... hanya tidak terlihat adalah U&L
DDS
@DDS Pemula belajar pemrograman C, atau belajar membangun di Linux? Tolong, lebih tepatnya. Misalnya saya berasal dari Windows. Itu tidak berarti saya tidak tahu C ++ ... Saya cenderung berpikir perilaku menghakimi Anda tidak akurat. Bahkan jika itu sudah di SO, perilaku Anda akan segera mendapatkan perhatian moderator. Sadarilah itu. Anda berada di situs COLLABORATIVE, dari programmer yang antusias berbagi pengetahuan yang bermanfaat. Bukan suatu tempat desain untuk menyanjung ego Anda. (Jangan khawatir, saya juga dihancurkan dengan lembut / wajar ketika saya mulai SO, dan saya pikir itu adalah hal yang sangat baik yang terjadi).
Stephane Rolland

Jawaban:

59

Untuk sesi saat ini, Anda bisa

ekspor LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

atau untuk membuat perubahan permanen Anda dapat menambahkan /usr/local/libuntuk /etc/ld.so.conf(atau sesuatu itu termasuk) dan menjalankan ldconfigsebagai root.

Jika Anda masih mengalami masalah, menjalankan ldd [executable name]akan menunjukkan kepada Anda perpustakaan yang sedang dicari, dan mana yang tidak dapat ditemukan.

Flup
sumber
3
Dari manhalaman untuk ldd(1)"Dalam kasus biasa, ldd memanggil tautan dinamis standar (lihat ld.so(8)) dengan LD_TRACE_LOADED_OBJECTSvariabel lingkungan yang disetel 1, yang menyebabkan tautan tersebut menampilkan dependensi perpustakaan. Perlu diketahui, bagaimanapun, bahwa dalam beberapa keadaan, beberapa versi lddmungkin . mencoba untuk mendapatkan informasi dependensi dengan langsung mengeksekusi program demikian, Anda harus tidak pernah mempekerjakan lddpada executable tidak dipercaya ., karena ini dapat mengakibatkan eksekusi kode sewenang-wenang A alternatif yang lebih aman ketika berhadapan dengan tidak dipercaya executable adalah: ..."
SlySven
4
"... $ objdump -p /path/to/program | grep NEEDED"
SlySven
Bagus - Saya belum pernah menemukan objdump sebelumnya.
Flup
Sebagai per ini artikel jawaban ini adalah kanonis tidak benar dan berbahaya . Untuk pendekatan yang benar penggunaan -Ldan -rpathselama kompilasi untuk mengatur jalan menghubungkan pencarian dan runtime path pencarian untuk perpustakaan adalah cara yang benar, sesuai ini pertanyaan dan jawaban.
Cliff Armstrong
37

Jika Anda sudah menjalankannya ldconfigsetelah membangun perpustakaan, teruslah membaca. Jika tidak, baca tentang ldconfig terlebih dahulu.

/usr/local/libmungkin tidak di jalur pustaka yang digunakan ldconfig. Anda bisa melakukan ini:

ldconfig /usr/local/lib

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.ddirektori. Jika demikian tambahkan file (sebut saja "usr-local.conf", atau apa pun), dan masukkan satu baris di dalamnya:

/usr/local/lib

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.

goldilocks
sumber
3
Saya telah menambahkan file custom.conf ke /etc/ld.so.conf.dsudoed ldconfig untuk memperhitungkannya dan executable saya dapat mulai sekarang.
Stephane Rolland