Dlaczego przy każdym uruchomieniu aplikacji muszę definiować ścieżkę biblioteki LD z eksportem?
Mam jakiś kod, który używa niektórych bibliotek współdzielonych (kod c na gcc). Podczas kompilacji muszę jawnie zdefiniować katalogi include i library używając-I i-l, ponieważ nie znajdują się one w standardowych miejscach. Kiedy próbuję uruchomić kod, pojawia się następujący błąd:
./sync_test
./sync_test: error while loading shared libraries: libsync.so: cannot open shared object file: No such file or directory
Jednak wykonaj następujące czynności, wszystko działa dobrze:
export LD_LIBRARY_PATH="/path/to/library/"
./sync_test
Najdziwniejsze jest to, że to działa tylko raz. Jeśli spróbuję ponownie uruchomić sync_test, dostaję ten sam błąd, chyba że uruchomię polecenie Eksportuj najpierw. Próbowałem dodać następujące do mojego .bashrc, ale to nie robi różnicy:
LD_LIBRARY_PATH="/path/to/library/"
7 answers
Użyj
export LD_LIBRARY_PATH="/path/to/library/"
W Twoim .w przeciwnym razie bashrc będzie dostępny tylko dla Basha, a nie dla żadnych uruchamianych programów.
Spróbuj użyć flagi -R/path/to/library/
Podczas łączenia, spowoduje to, że program będzie wyglądał w tym katalogu i nie będzie trzeba ustawiać żadnych zmiennych środowiskowych.
EDIT: wygląda na to, że {[2] } jest tylko Solaris, a Ty jesteś na Linuksie.
Alternatywnym sposobem byłoby dodanie ścieżki do /etc/ld.so.conf
i uruchomienie ldconfig
. Zauważ, że jest to globalna zmiana, która będzie miała zastosowanie do wszystkich dynamicznie połączonych / align = "left" /
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-12 02:44:13
Należy unikać ustawiania LD_LIBRARY_PATH
w swoim .bashrc
. Zobacz też "Why LD_LIBRARY_PATH is bad
" więcej informacji.
Użyj opcji linker -rpath podczas łączenia, aby dynamiczny linker wiedział, gdzie znaleźć libsync.so
podczas wykonywania.
gcc ... -Wl,-rpath /path/to/library -L/path/to/library -lsync -o sync_test
EDIT:
Innym sposobem byłoby użycie takiego opakowania
#!/bin/bash
LD_LIBRARY_PATH=/path/to/library sync_test "$@"
Jeśli sync_test
uruchomi jakiekolwiek inne programy, mogą w końcu użyć libs w /path/to/library
, które mogą, ale nie muszą być zamierzone.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-06 10:06:58
Czy "eksportujesz" w swoim .bashrc?
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-29 22:44:32
Możesz po prostu umieścić to wszystko w jednej linii:
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test
Powinno to ułatwić sprawę, nawet jeśli nie zmieni to niczego fundamentalnego
Zamiast nadpisywać ścieżkę przeszukiwania biblioteki w czasie wykonywania za pomocą LD_LIBRARY_PATH, możesz zamiast tego wstawić ją do samego pliku binarnego za pomocą rpath
. Jeśli łączysz się z GCC dodanie {[1] } powinno załatwić sprawę, jeśli łączysz się z ld to po prostu -rpath <libdir>
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-07 15:58:03
Możesz również dodać katalog zawierający biblioteki współdzielone do pliku /etc / ld. so.conf lub utworzyć nowy plik w /etc/ld.so. conf. d/
(sprawdziłem dystrybucję RHEL5 i Ubuntu, więc myślę, że jest to generic dla Linuksa)
Program ldconfig upewni się, że są włączone do całego systemu.
Zobacz poniższy link, aby uzyskać więcej informacje: www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/dlls.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-30 07:03:41
Możesz dodać w swoim kodzie system wywołania z nową definicją:
sprintf(newdef,"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%s:%s",ld1,ld2);
system(newdef);
Ale, nie wiem, to jest rozwiązanie rigth, ale to działa.
Pozdrawiam
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 22:01:41