Linux приложение не видит библиотеку so
В прошлый раз мы с Вами обнаружили, что запуск программ, скомпилированных вместе с динамическими библиотеками, вызывает ошибку:
Первая программа называется ldd. Она выдает на экран список динамических библиотек используемых в программе и их местоположение. В качестве параметра ей сообщается название обследуемой программы. Давайте попробуем использовать ее для нашей программы rezultdyn:
- libc.so.6 - стандартную библиотеку функций языка C++.
- ld-linux.so.2 - библиотеку динамической линковки программ ELF формата.
- libfsdyn.so - нашу динамическую библиотеку функций.
Нашу библиотеку она найти не может. И правильно! Динамический линковщик ищет библиотеки только в известных ему каталогах, а каталог нашей программы ему явно не известен.
Для того, чтобы добавить нашу директорию с библиотекой в список известных директорий надо подредактировать файл /etc/ld.so.conf. Например, у меня этот файл состоит из таких строк:
Во всех этих директории хранятся всеми используемые библиотеки. В этом списке нет лишь одной директории - /lib, которая сама по себе не нуждается в описании, так как она является главной. Получается, что наша библиотека станет "заметной", если поместить ее в один их этих каталогов, либо отдельно описать в отдельном каталоге. Давайте для теста опишем, добавим строку в конец файла ld.so.conf:
У меня этот файл валяется в домашнем каталога пользователя root, у Вас он может быть в другом месте. Теперь после этого динамический линковщик будет знать где можно найти наш файл, но после изменения конфигурационного файла ld.so.conf необходимо, чтобы система перечитала настройки заново. Это делает программа ldconfig. Пробуем запустить нашу программу:
Как видите все заработало :) Если теперь Вы удалите добавленную нами строку и снова запустите ldconfig, то данные о расположении нашей библиотеки исчезнут и будет появляться таже самая ошибка.
Но описанный метод влияет на всю систему в целом и требует доступа администратора системы, т.е. root. А если Вы простой пользователь без сверх возможностей ?!
Для такого случая есть другое безболезненное решение. Это использование специальной переменной среды LD_LIBRARY_PATH, в которой перечисляются все каталоги содержащие пользовательские динамические библиотеки. Для того, чтобы установить эту переменную в командной среде bash надо набрать всего несколько команд. Для начала посмотрим есть ли у нас такая переменная среды:
У меня в ответ выводится пустая строка, означающая, что такой переменной среды нет. Устанавливается она следующим образом:
После этого программа rezultdyn будет прекрасно работать. В случае, если у Вас в системе эта переменная среды уже уставновлена, то, чтобы не испортить ее значение, надо новый каталог прибавить к старому значению. Делается это другой командой:
Если Вы обнулите эту переменную, то снова библиотека перестанет работать:
Вы также параллельно можете зайти в систему под другим пользователем или даже тем же самым, но если Вы захотите просмотреть значение LD_LIBRARY_PATH, то увидите ее прежнее значение. Это означает, что два разных пользователя Linux не могут влиять на работу друг друга, а это и есть самое главное хорошее отличие систем Unix от большинства других систем.
Решил проверить свою курсовую на ошибки прогой etxt-antiplagiat, но она почему-то не видит библиотеки или их в системе нет:
ldd /opt/etxt-antiplagiat-bin/EtxtAntiplagiat
linux-gate.so.1 (0xf7f96000)
libQt5WebKitWidgets.so.5 => not found
libQt5WebKit.so.5 => not found
libQt5Widgets.so.5 => not found
libQt5Gui.so.5 => not found
libQt5Network.so.5 => not found
libQt5Test.so.5 => not found
libQt5Xml.so.5 => not found
libQt5Concurrent.so.5 => not found
libQt5Core.so.5 => not found
libGL.so.1 => /usr/lib32/libGL.so.1 (0xf7ea8000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf7e80000)
libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf7ca0000)
libm.so.6 => /usr/lib32/libm.so.6 (0xf7bd0000)
libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf7bb0000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf79c8000)
libGLdispatch.so.0 => /usr/lib32/libGLdispatch.so.0 (0xf7948000)
libGLX.so.0 => /usr/lib32/libGLX.so.0 (0xf7908000)
/lib/ld-linux.so.2 => /usr/lib/ld-linux.so.2 (0xf7f68000)
libdl.so.2 => /usr/lib32/libdl.so.2 (0xf7900000)
libX11.so.6 => /usr/lib32/libX11.so.6 (0xf77b0000)
libxcb.so.1 => /usr/lib32/libxcb.so.1 (0xf7780000)
libXau.so.6 => /usr/lib32/libXau.so.6 (0xf7778000)
libXdmcp.so.6 => /usr/lib32/libXdmcp.so.6 (0xf7770000)
И это при том, что у меня установлены все пакеты из группы qt5. Нашел похожую проблему у другого человека, но он в итоге каждую библиотеку с инета скачивал.
4 комментария
проблема решилась тем, что я запустил /opt/etxt-antiplagiat-bin/EtxtAntiplagiat.sh, но почему не видит библиотеки в системе для меня остаётся загадкой
проверил у себя, тоже не видело библиотеки, в основном из связанных с gstreamer0.10, переустановил все пакеты и увидело
вы конечно оба молодцы, но посмотрите в /opt/etxt-antiplagiat-bin/
а что туда смотреть?
пардон, немного ввел всех в заблуждение у меня был совершенно другой выхлоп
и что-то вроде
я написал, что не подтягивалось у меня, кстати, при запуске EtxtAntiplagiat.sh, но не описал подробно, в общем немного не так выразился, но указал какие библиотеки не видела прога
вы там наблюдаете libgstreamer-0.10.so или libgstapp-0.10.so.0?
а то что EtxtAntiplagiat.sh подтягивает либы это видно по его содержимому(вот и ответ на вопрос ТС'а кстати)))).
В общем, если у кого будут ошибки похожие с моими, то будут знать что делать.
Новые и опытные пользователи Linux могут сталкиваться с ошибкой error loading shared libraries во время запуска программ, также с ней могут сталкиваться программисты и все желающие компилировать программное обеспечение в своей системе. Эта ошибка в дословном переводе означает что возникла проблема во время загрузки общей библиотеки. О том что такое библиотеки и зачем они нужны вы можете узнать из статьи библиотеки Linux.
В этой же статье мы рассмотрим что значит ошибка error while loading shared libraries более подробно, а главное, как ее решить.
Что означает error while loading shared libraries?
Даже если вы не компилируете свои программы, то вы можете увидеть ошибку error while loading shared libraries: имя_библиотеки: cannot open shared object file: No such file or directory достаточно часто во время установки новых программ не через пакетный менеджер или программ, предназначенных для другого дистрибутива. Как я уже говорил, она возникает потому, что система не может найти библиотеку.
А вот почему ее нельзя найти и загрузить, это уже интересно. Этому может быть несколько причин:
- Библиотека не установлена в системе;
- Библиотека установлена, но неизвестно куда;
- Библиотека установлена правильно, но имеет не ту версию.
При решении проблемы мы будем руководствоваться именно этими причинами и пытаться их решить.
1. Библиотека не установлена
Первый вариант, тут все понятно, библиотеки просто нет в системе, поэтому мы и получаем такую ошибку. Верный способ ее решения - просто найти пакет библиотеки с помощью пакетного менеджера и установить ее. Обычно, пакеты с библиотеками называются так же, как и сами библиотеки с префиксом lib.
Например, если нам не хватает библиотеки libfuse2.so, то мы можем найти ее в Ubuntu такой командой:
sudo apt search libfuse2
Затем осталось только установить ее:
sudo apt install libfuse2
Если перед вами стоит задача собрать программу из исходников, то вам понадобится не только установить саму библиотеку, но и заголовочные файлы для нее:
sudo apt install libfuse-dev
И так для любой библиотеки. Но это не всегда помогает.
2. Библиотека находится не в том каталоге
Бывает что библиотека установлена, мы установили ее или она поставлялась вместе с программой, но ошибка как была, так и есть. Причиной этому может быть то, что загрузчик Linux не может найти библиотеку.
Поиск библиотек выполняется по всех папках, которые указаны в конфигурационных файлах /etc/ld.conf.d/. По умолчанию, это такие каталоги, как /usr/lib, /lib, /usr/lib64, /lib64. Если библиотека установлена в другой каталог, то, возможно, это и есть причина проблемы.
Вы можете посмотреть какие библиотеки сейчас доступны загрузчику с помощью команды:
Найти, где находится ваша библиотека можно с помощью команды locate. Например, нас интересует библиотека librtfreader.so:
Теперь мы знаем, что она находится по адресу /opt/kingsoft/wps-office/office6/. А значит, для работы программы необходимо сделать чтобы загрузчик библиотек ее видел. Для этого можно добавить путь в один из файлов /etc/ld.so.conf.d/ или же в переменную LD_LIBRARY_PATH:
Опять же, так вы можете поставить с любой библиотекой, которая взывает ошибку. Еще один более простой метод - это просто создать символическую ссылку на нужную библиотеку в правильной папке:
ln -s /opt/kingsoft/wps-office/office6/librtfreader.so /usr/lib/librtfreader.so
3. Неверная версия библиотеки
Эта причина ошибки довольно часто встречается при использовании программ не для вашего дистрибутива. Каждая библиотека имеет дополнительную версию, так называемую ревизию, которая записывается после расширения .so. Например, libav.so.1. Так вот, номер версии меняется всякий раз, когда в библиотеку вносятся какие-либо исправления.
Часто возникает ситуация, когда в одном дистрибутиве программа собирается с зависимостью от библиотеки, например, libc.so.1, а в другом есть только libc.so.2. Отличия в большинстве случаев здесь небольшие и программа могла бы работать на второй версии библиотеки. Поэтому мы можем просто создать символическую ссылку на нее.
Например, библиотеки libusb-1.0.so.1 нет. Но зато есть libusb-1.0.so.0.1, и мы можем ее использовать:
Для этого просто создаем символическую ссылку на библиотеку:
sudo ln -s /usr/lib/libusb-1.0.so.0.1 /usr/lib/libusb-1.0.so.1
В большинстве случаев программа не заметит подмены и будет работать, как и ожидалось. Также для решения этой проблемы можно попытаться найти нужную версию библиотеки в интернете для своей архитектуры и поместить ее в папку /usr/lib/ или /usr/lib64/. Но после этого желательно обновить кэш:
Выводы
В этой статье мы рассмотрели почему возникает ошибка Error while loading shared libraries, а также как ее решить. В большинстве случаев проблема решается довольно просто и вы получите работоспособную программу. Надеюсь, эта информация была полезной для вас.
Программа является частью набора тестов Xenomai, скомпилированного с ПК Linux в Linux + Xenomai ARM toolchain.
Изменить: ОК. Я не заметил, что .1 в конце был частью имени файла. Что это значит в любом случае?
ОТВЕТЫ
Ответ 1
Ну, это не вранье - в этом листинге нет libpthread_rt.so.1 . Вам, вероятно, нужно переконфигурировать и перестроить его так, чтобы оно зависело от имеющейся у вас библиотеки, или установить то, что предоставляет libpthread_rt.so.1 .
В вашем случае, вы можете сойти с символической ссылки libpthread_rt.so.1 на libpthread_rt.so . Однако нет никаких гарантий, что это не нарушит ваш код и не поужинает на телевидении.
Ответ 2
Ваша библиотека является динамической библиотекой. Вы должны сообщить операционной системе, где она может найти его во время выполнения.
Для этого нам понадобятся следующие простые шаги:
(1) Найдите, где находится библиотека, если вы ее не знаете.
(2) Проверьте наличие переменной среды пути динамической библиотеки ( LD_LIBRARY_PATH )
если нечего отображать, добавьте значение пути по умолчанию (или нет, если хотите)
(3) Мы добавляем желаемый путь, экспортируем его и пробуем приложение.
Обратите внимание, что путь должен быть каталогом, в котором находится path.so.something . Так что если path.so.something находится в /my_library/path.so.something он должен быть:
Ответ 3
Вот несколько решений, которые вы можете попробовать:
LDCONFIG
Как отметил AbiusX: если вы только что установили библиотеку, вам просто нужно запустить ldconfig.
ldconfig создает необходимые ссылки и кеширует самые последние общие библиотеки, найденные в каталогах, указанных в команде line в файле /etc/ld.so.conf и в доверенных каталогах (/lib и /usr/lib ).
Обычно ваш менеджер пакетов позаботится об этом при установке новой библиотеки, но не всегда, и это не помешает запустить ldconfig, даже если это не ваша проблема.
Dev-пакет или неправильная версия
Если это не сработает, я также рассмотрю предложение Paul и поискать версию библиотеки "-dev". Многие библиотеки разделены на dev и non-dev пакеты. Вы можете использовать эту команду для поиска:
Это также может помочь, если у вас установлена неправильная версия установленной библиотеки. Некоторые библиотеки публикуются в разных версиях одновременно, например, Python.
Местоположение библиотеки
Если вы уверены, что установлен правильный пакет, а ldconfig его не нашел, он может быть просто нестандартным. По умолчанию ldconfig выглядит в /lib , /usr/lib и каталогах, перечисленных в /etc/ld.so.conf и $LD_LIBRARY_PATH . Если ваша библиотека находится где-то в другом месте, вы можете добавить каталог в свою строку в /etc/ld.so.conf , добавить путь библиотеки к $LD_LIBRARY_PATH или переместить библиотеку в /usr/lib . Затем запустите ldconfig .
Чтобы узнать, где находится библиотека, попробуйте следующее:
(Замените libraryname на имя вашей библиотеки)
Если вы перейдете по маршруту $LD_LIBRARY_PATH , вы захотите поместить его в свой файл
/.bashrc , чтобы он запускался каждый раз при входе в систему:
Ответ 4
У меня была аналогичная ошибка, я мог бы разрешить ее, указав
Надеюсь, это поможет.
Ответ 5
Вам необходимо убедиться, что вы указали путь к библиотеке во время связывание при компиляции вашего .c файла:
gcc -I/usr/local/include xxx.c -o xxx -L/usr/local/lib -Wl, -R/USR/локальные/Библиотека
Часть -Wl, -R сообщает полученному двоичному файлу также искать библиотеку в /usr/local/lib во время выполнения, прежде чем пытаться использовать его в /usr/lib/
Надеюсь, это поможет вам.
Ответ 6
Кроме того, обратите внимание, что "внешнее управление версиями" в значительной степени устарело в Linux, поскольку управление версиями символов (расширение GNU) позволяет вам иметь несколько несовместимых версий одной и той же функции в одной библиотеке. Это расширение позволило glibc иметь ту же внешнюю версию: libc.so.6 за последние 10 лет.
Ответ 7
Попробуйте добавить LD_LIBRARY_PATH , который указывает пути поиска, в ваш файл
Ответ 8
добавить эти строки в конец
Ответ 9
Другое возможное решение в зависимости от вашей ситуации.
Если вы знаете, что libpthread_rt.so.1 совпадает с libpthread_rt.so, вы можете создать символическую ссылку:
Затем ls -l /lib должен теперь показать символическую ссылку и то, на что она указывает.
Ответ 10
Выполнить как → Выполнить настройки → Среда
Ответ 11
У меня была похожая ошибка, и она не устранилась с выдачей LD_LIBRARY_PATH в
/.bashrc. Что решило мою проблему, добавив файл .conf и загрузив его. Перейти к терминалу и быть в Су.
Добавьте путь к вашей библиотеке в этом файле и сохраните его (например,/usr/local/lib). Вы должны выполнить следующую команду, чтобы активировать путь:
Проверьте ваш новый путь к библиотеке:
Если это показывает ваши файлы библиотеки, то вы готовы.
Ответ 12
попробуйте установить sudo lib32z1
Ответ 13
Все, что мне нужно было сделать, было запущено:
Я был в папке, расположенной в /usr/lib/x86_64-linux-gnu , и работал отлично.
Ответ 14
Если вы запускаете приложение в Microsoft Windows, путь к динамическим библиотекам (DLL) должен быть определен в переменной среды PATH.
Если вы запускаете приложение в UNIX, путь к динамическим библиотекам (.so) должен быть определен в переменной среды LD_LIBRARY_PATH.
Ответ 15
Произошла ошибка, поскольку система не может сослаться на упомянутый файл библиотеки. Сделайте следующие шаги:
- При запуске locate libpthread_rt.so.1 будет locate libpthread_rt.so.1 путь ко всем файлам с этим именем. Предположим, что путь это /home/user/loc .
- Скопируйте путь и запустите cd home/USERNAME . Замените USERNAME на имя текущего активного пользователя, с которым вы хотите запустить файл.
- Запустите vi.bash_profile и в конце параметра LD_LIBRARY_PATH , прямо перед . , добавьте строку /lib://home/usr/loc:. , Сохраните файл.
- Закройте терминал и перезапустите приложение. Это должно бежать.
Ответ 16
Я получил эту ошибку, и я думаю, что это та же самая причина, по которой вы
Попробуй это. Исправьте права на файлы:
"sudo su", чтобы получить разрешения для вашей файловой системы.
Ответ 17
Я получил эту ошибку, и я думаю, что это та же самая причина, по которой вы
ошибка при загрузке общих библиотек: libnw.so: невозможно открыть файл общего объекта: такого файла или каталога нет
Попробуй это. Исправьте права на файлы:
Ответ 18
Читайте также: