Mam plik wykonywalny, który musi łączyć się libtest.so
dynamicznie, więc umieszczam je w tym samym katalogu, a następnie:
cd path_to_dir
./binary
Ale dostałem to:
error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
Jak może nie być w stanie znaleźć, libtest.so
który jest już w tym samym katalogu, co sam plik wykonywalny?
linux
autoloader
linuxer
źródło
źródło
echo $LD_LIBRARY_PATH
jest pusty na mojej maszynie :(:
), a nie średnikiem.Chociaż możesz ustawić LD_LIBRARY_PATH, aby dynamiczny linker wiedział, gdzie szukać, istnieją lepsze opcje. Możesz umieścić udostępnioną bibliotekę w jednym ze standardowych miejsc, zobacz
/etc/ld.so.conf
(w systemie Linux) i/usr/bin/crle
(w systemie Solaris) listę tych miejscMożesz przejść
-R <path>
do linkera podczas budowania pliku binarnego, który doda<path>
do listy katalogów skanowanych w celu udostępnienia biblioteki. Oto przykład. Po pierwsze, pokazując problem:libtest.h:
libtest.c:
cześć, c:
Makefile (należy użyć tabulatorów):
Uruchommy to:
Jak to naprawić? Dodaj
-R <path>
do flag linkera (tutaj, ustawiającLDFLAGS
).Patrząc na plik binarny, widać, że potrzebuje
libtest.so.0
:Plik binarny będzie szukał swoich bibliotek, oprócz standardowych miejsc, w określonym katalogu:
Jeśli chcesz, aby plik binarny wyglądał w bieżącym katalogu, możesz ustawić RPATH na
$ORIGIN
. Jest to nieco trudne, ponieważ musisz upewnić się, że znak dolara nie jest interpretowany przez markę. Oto jeden ze sposobów, aby to zrobić:źródło
make
, na przykład podczas ręcznego wywoływaniag++
, spróbuj-Wl,-rpath='$ORIGIN'
(zwróć uwagę na pojedyncze cudzysłowy), aby zapobiec$ORIGIN
rozwijaniu do pustego ciągu.Aby załadować współdzielone obiekty z tego samego katalogu co plik wykonywalny, po prostu wykonaj:
Uwaga: Nie zmodyfikuje zmiennej LD_LIBRARY_PATH twojego systemu. Zmiana wpływa tylko na to i tylko na wykonanie twojego programu.
źródło
Dla każdego, kto wciąż zmaga się z odpowiedzią, znalazłem ją z następującą sugestią:
Możesz spróbować zaktualizować plik ld.so.cache, używając:
sudo ldconfig -v
Pracował dla mnie.
źródło
Dla każdego, kto używa CMake do ich kompilacji, możesz ustawić
CMAKE_EXE_LINKER_FLAGS
następujące opcje:Spowoduje to prawidłowe propagowanie flag linkera dla wszystkich typów kompilacji (np. Debugowania, wydania itp.), Aby najpierw wyszukać pliki .so w bieżącym katalogu roboczym.
źródło
Dynamiczny linker zdecyduje, gdzie szukać bibliotek. W przypadku Linuksa linker dynamiczny zwykle jest
GNU ld.so
(lub alternatywą, która zwykle zachowuje się identycznie ze względu na kompatybilność.Cytaty z Wikipedii:
Źródło: https://en.wikipedia.org/wiki/Rpath
źródło