ошибка при загрузке общих библиотек: libboost_system.so.1.45.0: невозможно открыть файл общего объекта: нет такого файла или каталога - PullRequest
24 голосов
/ 03 января 2011

Я строю исполняемый файл C ++ в Linux. Исполняемый файл ссылается на некоторые библиотеки повышения.

Это вывод при попытке запустить двоичный файл:

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

Затем я запускаю ldd для двоичного файла, чтобы проверить зависимости:

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)

Я не уверен, почему не найден SO liboos_system.sl.1.45.0. Я построил это успешно немного ранее сегодня. Кто-нибудь может объяснить?

Ответы [ 3 ]

25 голосов
/ 03 января 2011

Библиотека не найдена.

Библиотеки по умолчанию ищутся в /lib, /usr/lib, а каталоги указываются /etc/ld.so.conf.

Обычно системные библиотеки (например, boost, если вы установили его через менеджер пакетов) находятся в /usr/lib, но, вероятно, это не ваш случай.

Где находятся ваши буст-библиотеки в вашей системе? Вы сами их скомпилировали? В этом случае вы должны указать динамическому компоновщику искать ваши библиотеки в каталоге, в котором они находятся, используя переменную окружения LD_LIBRARY_PATH:

LD_LIBRARY_PATH="your/boost/directory" ./testfgci

Я бы посоветовал вам установить библиотеки boost с помощью вашего менеджера пакетов, в любом случае, это сделает вашу жизнь намного проще.

20 голосов
/ 02 марта 2012

Я знаю, что это старый файл, но вы можете запустить ldconfig, чтобы восстановить ваш кэш ld. Таким образом, вам не нужно обновлять LD_LIBRARY_PATH.

5 голосов
/ 09 июля 2013

Я просто хотел добавить заметку для пользователей Ubuntu (и, наверное, Debian): эти системы имеют «функцию» безопасности, которая стирает LD_LIBRARY_PATH. Это не работает:

В /etc/environemnt или ~/.profile или ~/.bash_profile:

export LD_LIBRARY_PATH=/usr/local/boost_1_54_0/stage/lib:$LD_LIBRARY_PATH

Это будет работать для ~/.bashrc, но путь будет установлен только для этого конкретного интерактивная оболочка. Это означает, что если вы вызываете make, например, из emacs или eclipse, он не будет работать, если вы не запустили emacs из оболочки, а не из модуля запуска.

Вот что у меня сработало:

echo -e "\n/usr/local/boost_1_54_0/stage/lib" | sudo tee -a /etc/ld.so.conf 
sudo ldconfig
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...