Mam kilka bibliotek ze źródeł, a pliki po nim make install
są/usr/local/lib
Na przykład w moim przypadku mam plik, libodb-2.2.so
który znajduje się w tym katalogu.
Jednak gdy uruchamiam plik wykonywalny, z którym się połączyłem, pojawia libodb
się błąd: błąd podczas ładowania bibliotek współdzielonych:libodb-2.2.so: cannont open shared object file: No such file or directory.
Czy to oznacza, że nie mam poprawnie zbudować mojego pliku wykonywalnego? czy powinienem wskazać systemowi, że w folderze mogą znajdować się ciekawe biblioteki /usr/local/lib
?
Używam Ubuntu 12.04, jądro Linuksa 3.2.0-38-generic.
gdb
pomógłbylink
problem. Jestem naprawdę ciekawy. Z początku twoja uwaga wydaje mi się niezwiązana z problemem. Ale mogę się mylić. Rzeczywiście nie wiem wystarczającogdb
, a ładowanie bibliotek.Odpowiedzi:
W przypadku bieżącej sesji możesz
lub dokonać zmiany stałego można dodać
/usr/local/lib
do/etc/ld.so.conf
(lub coś to obejmuje) i uruchomldconfig
jako root.Jeśli nadal masz problemy, uruchomienie
ldd [executable name]
pokaże biblioteki, które próbuje znaleźć, a których nie można znaleźć.źródło
man
strony dlaldd(1)
„W typowym przypadku, LDD wywołuje standardowy linker dynamiczny (zobaczld.so(8)
) zLD_TRACE_LOADED_OBJECTS
zmiennej środowiskowej ustawiony1
, co powoduje, że łącznik do wyświetlania zależności biblioteki. Należy jednak pamiętać, że w pewnych okolicznościach, niektóre wersjeldd
maja . próba uzyskania informacji o zależnościach bezpośrednio wykonując program Zatem należy nigdy zatrudnianialdd
na niezaufanych wykonywalnego ., gdyż może to spowodować wykonanie dowolnego kodu bezpieczniejszej alternatywy gdy ma do czynienia z niezaufanych wykonywalnych jest ...”$ objdump -p /path/to/program | grep NEEDED
”-L
i-rpath
podczas kompilacji, aby ustawić ścieżkę przeszukiwania linków i ścieżkę przeszukiwania bibliotek wykonawczych, jest prawidłowym sposobem, zgodnie z tym pytaniem i odpowiedzią.Jeśli już uruchomiłeś
ldconfig
po zbudowaniu biblioteki, czytaj dalej. Jeśli nie, najpierw przeczytaj o ldconfig ./usr/local/lib
może nie znajdować się w ścieżce biblioteki używanej przez ldconfig. Możesz po prostu to zrobić:Rzeczy należy dodać do pamięci podręcznej linkera, ale prawdopodobnie lepiej jest poprawnie dodać ścieżkę. Upewnij się, że masz
/etc/ld.so.conf.d
katalog. Jeśli tak, dodaj plik (nazwij go „usr-local.conf” lub cokolwiek innego) i umieść w nim jedną linię:Teraz biegnij
ldconfig
. Jeśli nie masz katalogu ld.so.conf.d, powinieneś mieć/etc/ld.so.conf
plik i możesz dodać ten wiersz na końcu.źródło
/etc/ld.so.conf.d
sudoedowanego ldconfig, aby wziąć go pod uwagę, a mój plik wykonywalny można rozpocząć teraz.