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ć?

Author: skyeagle, 2011-01-03

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.

 29
Author: peoro,
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.

 26
Author: ontek,
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
 6
Author: abo-abo,
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