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/"
Author: sigjuice, 2009-03-30

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" /

 40
Author: brian-brazil,
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.

 44
Author: sigjuice,
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"
 10
Author: bedwyr,
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

 10
Author: ,
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 23:12:29

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>.

 4
Author: fgp,
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

 2
Author: Roalt,
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

 0
Author: user3916212,
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