Użyj bibliotek współdzielonych w / usr / local / lib

58

Mam kilka bibliotek ze źródeł, a pliki po nim make install/usr/local/lib

Na przykład w moim przypadku mam plik, libodb-2.2.soktóry znajduje się w tym katalogu.

Jednak gdy uruchamiam plik wykonywalny, z którym się połączyłem, pojawia libodbsię 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.

Stephane Rolland
źródło
askubuntu.com/questions/165027/… , stackoverflow.com/questions/17889799/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Zdecydowanie sugeruję nawiązanie dobrych relacji przyjaźni ze swoim debuggerem
DDS
@DDS Sugeruję, abyś rozwinął nieco więcej. Wiesz, że jest to strona współpracy. Proszę na przykład wskazać sposób, w jaki gdbpomógłby linkproblem. Jestem naprawdę ciekawy. Z początku twoja uwaga wydaje mi się niezwiązana z problemem. Ale mogę się mylić. Rzeczywiście nie wiem wystarczająco gdb, a ładowanie bibliotek.
Stephane Rolland
Przepraszamy ... ten komentarz powinien był zostać umieszczony na stackoverflow w pytaniu ucznia o programowaniu w C ... po prostu nie widziałem U&L
DDS
@DDS Początkujący w nauce programowania C lub na uczeniu się na Linuksie? Proszę, bądź bardziej precyzyjny. Na przykład pochodziłem z systemu Windows. To nie znaczy, że nie znam C ++ ... Wydaje mi się, że twoje osądzające zachowanie nie jest dokładne. Nawet jeśli było to na SO, twoje zachowanie wkrótce przyciągnie uwagę moderatorów. Bądź tego świadomy. Jesteś na stronie WSPÓŁPRACA, z entuzjastów programistów dzielących się użyteczną wiedzą. Nie jest to projekt, który pochlebia twoje ego. (Nie martw się, gdy zacząłem SO, zostałem też delikatnie / rozsądnie pobity i myślę, że to była naprawdę dobra rzecz).
Stephane Rolland

Odpowiedzi:

58

W przypadku bieżącej sesji możesz

eksportuj LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

lub dokonać zmiany stałego można dodać /usr/local/libdo /etc/ld.so.conf(lub coś to obejmuje) i uruchom ldconfigjako 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źć.

Flup
źródło
3
Od manstrony dla ldd(1)„W typowym przypadku, LDD wywołuje standardowy linker dynamiczny (zobacz ld.so(8)) z LD_TRACE_LOADED_OBJECTSzmiennej środowiskowej ustawiony 1, co powoduje, że łącznik do wyświetlania zależności biblioteki. Należy jednak pamiętać, że w pewnych okolicznościach, niektóre wersje lddmaja . próba uzyskania informacji o zależnościach bezpośrednio wykonując program Zatem należy nigdy zatrudniania lddna niezaufanych wykonywalnego ., gdyż może to spowodować wykonanie dowolnego kodu bezpieczniejszej alternatywy gdy ma do czynienia z niezaufanych wykonywalnych jest ...”
SlySven
4
„... $ objdump -p /path/to/program | grep NEEDED
SlySven,
Fajny - nigdy wcześniej nie spotkałem objdump.
Flup,
Zgodnie z tym artykułem odpowiedź jest kanonicznie niepoprawna i szkodliwa . Dla poprawnego podejścia użycie -Li -rpathpodczas kompilacji, aby ustawić ścieżkę przeszukiwania linków i ścieżkę przeszukiwania bibliotek wykonawczych, jest prawidłowym sposobem, zgodnie z tym pytaniem i odpowiedzią.
Cliff Armstrong,
37

Jeśli już uruchomiłeś ldconfigpo zbudowaniu biblioteki, czytaj dalej. Jeśli nie, najpierw przeczytaj o ldconfig .

/usr/local/libmoże nie znajdować się w ścieżce biblioteki używanej przez ldconfig. Możesz po prostu to zrobić:

ldconfig /usr/local/lib

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.dkatalog. Jeśli tak, dodaj plik (nazwij go „usr-local.conf” lub cokolwiek innego) i umieść w nim jedną linię:

/usr/local/lib

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.

Złotowłosa
źródło
3
Dodałem plik custom.conf do /etc/ld.so.conf.dsudoedowanego ldconfig, aby wziąć go pod uwagę, a mój plik wykonywalny można rozpocząć teraz.
Stephane Rolland