Ошибка Linux при загрузке общих библиотек: невозможно открыть файл общего объекта: нет такого файла или каталога
Программа является частью набора тестов Xenomai, кросс-скомпилированного из ПК с Linux в набор инструментов Linux+Xenomai ARM.
# echo $LD_LIBRARY_PATH
/lib
# ls /lib
ld-2.3.3.so libdl-2.3.3.so libpthread-0.10.so
ld-linux.so.2 libdl.so.2 libpthread.so.0
libc-2.3.3.so libgcc_s.so libpthread_rt.so
libc.so.6 libgcc_s.so.1 libstdc++.so.6
libcrypt-2.3.3.so libm-2.3.3.so libstdc++.so.6.0.9
libcrypt.so.1 libm.so.6
# ./clocktest
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory
Изменить: ОК, я не заметил.1 в конце был частью имени файла. Что это значит?
22 ответа
Обновить
Хотя то, что я пишу ниже, верно в качестве общего ответа об общих библиотеках, я думаю, что наиболее частой причиной такого рода сообщений является то, что вы установили пакет, но не установили версию этого пакета "-dev".
Ну, это не вранье - нет libpthread_rt.so.1
в этом списке. Вам, вероятно, нужно переконфигурировать и перестроить его так, чтобы оно зависело от имеющейся у вас библиотеки, или установить все, что предоставляет libpthread_rt.so.1
,
Как правило, числа после.so являются номерами версий, и вы часто обнаруживаете, что они являются символическими ссылками друг на друга, поэтому, если у вас версия libfoo.so версии 1.1, у вас будет настоящий файл libfoo.so.1.0, и символические ссылки foo.so и foo.so.1, указывающие на libfoo.so.1.0. И если вы устанавливаете версию 1.1, не удаляя другую, у вас будет libfoo.so.1.1, а libfoo.so.1 и libfoo.so теперь будут указывать на новую, но любой код, для которого требуется эта точная версия, может используйте файл libfoo.so.1.0. Код, который опирается только на API версии 1, но не заботится, будет ли он 1.0 или 1.1, будет указывать libfoo.so.1. Как указал orip в комментариях, это хорошо объясняется на http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html.
В вашем случае, вы можете сойти с ссылки libpthread_rt.so.1
в libpthread_rt.so
, Однако нет никаких гарантий, что это не нарушит ваш код и не поужинает на телевидении.
Ваша библиотека является динамической библиотекой. Вы должны указать операционной системе, где она может найти его во время выполнения.
Для этого нам понадобятся следующие простые шаги:
(1) Найдите, где находится библиотека, если вы ее не знаете.
sudo find / -name the_name_of_the_file.so
(2) Проверьте наличие переменной среды пути динамической библиотеки (LD_LIBRARY_PATH
)
$ echo $LD_LIBRARY_PATH
если нечего отображать, добавьте значение пути по умолчанию (или нет, если хотите)
$ LD_LIBRARY_PATH=/usr/local/lib
(3) Мы добавляем желаемый путь, экспортируем его и пробуем приложение.
Обратите внимание, что путь должен быть каталогом, в котором path.so.something
является. Так что если path.so.something
в /my_library/path.so.something
так должно быть:
$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app
источник: http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html
Вот несколько решений, которые вы можете попробовать:
LDCONFIG
Как отметил AbiusX: если вы только что установили библиотеку, вам может потребоваться просто запустить ldconfig.
sudo ldconfig
ldconfig создает необходимые ссылки и кэш для самых последних общих библиотек, найденных в каталогах, указанных в командной строке, в файле /etc/ld.so.conf и в доверенных каталогах (/lib и /usr/lib).
Обычно менеджер пакетов позаботится об этом при установке новой библиотеки, но не всегда, и запуск ldconfig не повредит, даже если это не ваша проблема.
Пакет разработчика или неправильная версия
Если это не сработает, я также проверю предложение Пола и поищу версию библиотеки "-dev". Многие библиотеки разделены на пакеты dev и non-dev. Вы можете использовать эту команду для поиска:
apt-cache search <libraryname>
Это также может помочь, если у вас просто установлена неверная версия библиотеки. Некоторые библиотеки публикуются в разных версиях одновременно, например, Python.
Расположение библиотеки
Если вы уверены, что установлен правильный пакет, а ldconfig его не нашел, он может просто находиться в нестандартном каталоге. По умолчанию ldconfig смотрит в /lib
, /usr/lib
и каталоги, перечисленные в /etc/ld.so.conf
а также $LD_LIBRARY_PATH
, Если ваша библиотека находится где-то еще, вы можете добавить каталог в отдельную строку в /etc/ld.so.conf
, добавьте путь к библиотеке $LD_LIBRARY_PATH
или переместите библиотеку в /usr/lib
, Тогда беги ldconfig
,
Чтобы узнать, где находится библиотека, попробуйте это:
sudo find / -iname *libraryname*.so*
(Заменить libraryname
с названием вашей библиотеки)
Если вы идете $LD_LIBRARY_PATH
маршрут, вы захотите поместить это в свой ~/.bashrc
файл, так что он будет запускаться каждый раз, когда вы входите в систему:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library
У меня была похожая ошибка, я мог ее исправить, дав,
sudo ldconfig -v
Надеюсь это поможет.
Необходимо убедиться, что вы указали путь к библиотеке во время компоновки при компиляции вашего файла.c:
gcc -I / usr / local / include xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / local / lib
Часть -Wl, -R сообщает результирующему двоичному файлу также, что нужно искать библиотеку в / usr / local / lib во время выполнения, прежде чем пытаться использовать библиотеку в / usr / lib /
Надеюсь, это поможет вам.
Попробуйте добавить LD_LIBRARY_PATH
, который указывает пути поиска, к вашему ~/.bashrc
файл
LD_LIBRARY_PATH=path_to_your_library
Оно работает!
Справочная страница linux.org объясняет механику, но не объясняет мотивацию этого:-(
Для этого, смотрите Sun Linker и Библиотеки Guide
Кроме того, обратите внимание, что "внешнее управление версиями" в Linux в значительной степени устарело, поскольку управление версиями символов (расширение GNU) позволяет вам иметь несколько несовместимых версий одной и той же функции, которые будут присутствовать в одной библиотеке. Это расширение позволило glibc иметь такую же внешнюю версию: libc.so.6
за последние 10 лет.
cd /home/<user_name>/
sudo vi .bash_profile
добавить эти строки в конце
LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH
Хотел добавить, если у ваших библиотек нестандартный путь, запустите
ldconfig
следует путь.
Например, мне пришлось бежать:
sudo ldconfig /opt/intel/oneapi/mkl/2021.2.0/lib/intel64
для компиляции R с Intel MKL
Другое возможное решение в зависимости от вашей ситуации.
Если вы знаете, что libpthread_rt.so.1 совпадает с libpthread_rt.so, вы можете создать символическую ссылку:
ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1
затем ls -l /lib
теперь должен показать символическую ссылку и на что она указывает.
У меня была похожая ошибка, и она не устранилась с выдачей LD_LIBRARY_PATH в ~/.bashrc . Что решило мою проблему, добавив файл.conf и загрузив его. Перейти к терминалу и быть в су.
gedit /etc/ld.so.conf.d/myapp.conf
Добавьте путь к вашей библиотеке в этом файле и сохраните его (например, / usr / local / lib). Вы должны выполнить следующую команду, чтобы активировать путь:
ldconfig
Проверьте ваш новый путь к библиотеке:
ldconfig -v | less
Если это показывает ваши файлы библиотеки, то вы готовы.
Бег:
sudo ldconfig
было достаточно, чтобы решить мою проблему.
У меня была эта ошибка при запуске моего приложения с Eclipse CDT в Linux x86.
Чтобы исправить это:
- В Затмении:
Выполнить как -> Выполнить настройки -> Среда
Установить путь
LD_LIBRARY_PATH=/my_lib_directory_path
Если вы запускаете приложение в Microsoft Windows, путь к динамическим библиотекам (.dll) должен быть определен в переменной среды PATH.
Если вы запускаете свое приложение в UNIX, путь к динамическим библиотекам (.so) должен быть определен в переменной среды LD_LIBRARY_PATH.
Я использую Ubuntu 18.04
У меня сработала установка соответствующего пакета "-dev",
sudo apt install libgconf2-dev
Я получал ошибку ниже, пока не установил указанный выше пакет,
turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
Попробуйте установить sudo lib32z1
sudo apt-get установить lib32z1
Все, что мне нужно было сделать, это запустить:
sudo apt-get install libfontconfig1
Я был в папке, расположенной в /usr/lib/x86_64-linux-gnu
и это сработало отлично.
Произошла ошибка, поскольку система не может сослаться на упомянутый файл библиотеки. Сделайте следующие шаги:
- Бег
locate libpthread_rt.so.1
отобразит путь ко всем файлам с таким именем. Давайте предположим, что путь/home/user/loc
, - Скопируйте путь и запустите
cd home/USERNAME
, Замените USERNAME на имя текущего активного пользователя, с которым вы хотите запустить файл. - Бежать
vi .bash_profile
и в концеLD_LIBRARY_PATH
параметр, непосредственно перед.
, добавьте строку/lib://home/usr/loc:.
, Сохраните файл. - Закройте терминал и перезапустите приложение. Это должно бежать.
Я получил эту ошибку, и я думаю, что это та же самая причина, по которой вы
ошибка при загрузке общих библиотек: libnw.so: невозможно открыть файл общего объекта: нет такого файла или каталога
Попробуй это. Исправьте права на файлы:
cd /opt/Popcorn (or wherever it is)
chmod -R 555 * (755 if not ok)
Похожая проблема найдена здесь: https://bugzilla.redhat.com/show_bug.cgi?id=1456202 Я пробовал упомянутое решение, и оно на самом деле работает.
Решения в предыдущих вопросах могут работать. Но я думаю, что это простой способ исправить это. Попробуйте переустановить пакет libwbclient
в федоре:
dnf reinstall libwbclient
Я получил эту ошибку, и я думаю, что это та же самая причина, по которой вы
error while loading shared libraries: libnw.so: cannot open shared object
file: No such file or directory
Попробуй это. Исправьте права на файлы:
cd /opt/Popcorn (or wherever it is)
chmod -R 555 * (755 if not ok)
chown -R root:root *
"Sudo su", чтобы получить разрешения для вашей файловой системы.
Вы можете прочитать о библиотеках здесь:https://domiyanyue.medium.com/c-development-tutorial-4-static-and-dynamic-libraries-7b537656163e