Saya memiliki executable yang perlu dihubungkan dengan libtest.so
secara dinamis, jadi saya meletakkannya di direktori yang sama, lalu:
cd path_to_dir
./binary
Tapi dapatkan ini:
error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
Bagaimana tidak dapat menemukan libtest.so
yang sudah ada di direktori yang sama dengan yang dapat dieksekusi itu sendiri?
linux
autoloader
linuxer
sumber
sumber
echo $LD_LIBRARY_PATH
kosong di komputer saya :(:
), bukan titik koma.Meskipun Anda dapat mengatur LD_LIBRARY_PATH agar pemberi tautan dinamis tahu ke mana harus mencari, ada opsi yang lebih baik. Anda dapat meletakkan perpustakaan Anda bersama di salah satu tempat standar, lihat
/etc/ld.so.conf
(di Linux) dan/usr/bin/crle
(di Solaris) untuk daftar tempat-tempat iniAnda dapat meneruskan
-R <path>
ke tautan saat membuat biner, yang akan menambah<path>
daftar direktori yang dipindai untuk pustaka bersama Anda. Ini sebuah contoh. Pertama, menunjukkan masalah:libtest.h:
libtest.c:
hello.c:
Makefile (tab harus digunakan):
Mari kita jalankan:
Bagaimana memperbaikinya? Tambahkan
-R <path>
ke bendera linker (di sini, dengan pengaturanLDFLAGS
).Melihat biner, Anda dapat melihat bahwa ia membutuhkan
libtest.so.0
:Biner akan mencari perpustakaannya, terlepas dari tempat standar, di direktori yang ditentukan:
Jika Anda ingin biner terlihat di direktori saat ini, Anda dapat mengatur RPATH ke
$ORIGIN
. Ini agak sulit, karena Anda perlu memastikan bahwa tanda dolar tidak ditafsirkan oleh make. Inilah satu cara untuk melakukannya:sumber
make
, seperti saat menelepon secara manualg++
, coba-Wl,-rpath='$ORIGIN'
(catat tanda kutip tunggal) untuk mencegah$ORIGIN
meluas ke string kosong.Untuk memuat objek yang dibagikan dari direktori yang sama dengan executable Anda, cukup jalankan:
Catatan: Itu tidak akan mengubah variabel LD_LIBRARY_PATH dari sistem Anda. Perubahan hanya berdampak pada ini, dan hanya ini, eksekusi program Anda.
sumber
Bagi siapa pun yang masih berjuang tanpa jawaban, saya menemukan sendiri dengan saran berikut:
Anda dapat mencoba memperbarui ld.so.cache menggunakan:
sudo ldconfig -v
Bekerja untukku.
sumber
Bagi siapa saja yang menggunakan CMake untuk build mereka, Anda dapat mengatur hal
CMAKE_EXE_LINKER_FLAGS
-hal berikut:Ini akan menyebarkan flag tautan dengan benar untuk semua tipe build (mis., Debug, Release, dll ...) untuk mencari file .so di direktori kerja saat ini terlebih dahulu.
sumber
Linker dinamis akan memutuskan di mana mencari perpustakaan. Dalam kasus Linux, biasanya dynamic linker adalah
GNU ld.so
(atau alternatif yang biasanya akan berperilaku identik karena alasan kompatibilitas).Mengutip dari Wikipedia:
Sumber: https://en.wikipedia.org/wiki/Rpath
sumber