błąd podczas ładowania bibliotek współdzielonych: libboost system.so.1.45.0: nie można otworzyć pliku obiektu współdzielonego: brak takiego pliku lub katalogu
Buduję plik wykonywalny C++ na Linuksie. Wykonywalne linki do niektórych bibliotek boost.
To jest wyjście, gdy próbuję uruchomić plik binarny:
root@yourbox:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ./testfgci
./testfgci: error while loading shared libraries: libboost_system.so.1.45.0: cannot open shared object file: No such file or directory
Następnie uruchamiam ldd na binarnym, aby sprawdzić zależności:
root@yourbox:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ldd testfgci
linux-gate.so.1 => (0x00380000)
libboost_system.so.1.45.0 => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00b50000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x005f6000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0099a000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x001b3000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00110000)
/lib/ld-linux.so.2 (0x00ea2000)
Nie jestem pewien, dlaczego liboos_system.SL.1. 45. 0 SO nie został znaleziony. Zbudowałem go z powodzeniem nieco wcześniej. Czy ktoś może to wyjaśnić?
3 answers
Biblioteka nie może zostać znaleziona.
Biblioteki są domyślnie szukane w /lib
, /usr/lib
oraz katalogów określonych przez /etc/ld.so.conf
.
Zazwyczaj biblioteki systemowe (jak boost, jeśli zainstalowałeś je za pomocą menedżera pakietów) znajdują się w /usr/lib
, ale prawdopodobnie nie jest to Twój przypadek.
Gdzie znajdują się Twoje biblioteki boost w Twoim systemie? Sam je skompilowałeś? W takim przypadku powinieneś powiedzieć linkerowi dynamicznemu, aby szukał Twoich bibliotek w katalogu, w którym się znajdują używając zmiennej środowiskowej LD_LIBRARY_PATH
:
LD_LIBRARY_PATH="your/boost/directory" ./testfgci
Sugerowałbym Ci zainstalowanie bibliotek boost przy użyciu menedżera pakietów, w każdym razie, to ułatwi Ci życie.
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
2011-01-03 00:53:21
Wiem, że jest stary, ale możesz uruchomić ldconfig
, aby odbudować pamięć podręczną ld. W ten sposób nie musisz aktualizować LD_LIBRARY_PATH
.
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-03-02 03:19:30
Chciałem tylko dodać notkę dla użytkowników Ubuntu (i Debiana, chyba):
systemy te mają "funkcję" bezpieczeństwa, która usuwa LD_LIBRARY_PATH
.
To nie działa:
W /etc/environemnt
lub ~/.profile
lub ~/.bash_profile
:
export LD_LIBRARY_PATH=/usr/local/boost_1_54_0/stage/lib:$LD_LIBRARY_PATH
Będzie działać dla ~/.bashrc
, ale ścieżka będzie ustawiona tylko dla tego konkretnego
interaktywna powłoka. Oznacza to, że jeśli wywołasz make
z np. emacs
lub eclipse
,
to nie zadziała, chyba że uruchomiłeś emacs
z powłoki, a nie z wyrzutni.
To działa dla mnie:
echo -e "\n/usr/local/boost_1_54_0/stage/lib" | sudo tee -a /etc/ld.so.conf
sudo ldconfig
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
2013-07-09 12:54:34