Ошибки Linux при загрузке разделяемых библиотек: невозможно открыть разделяемый объектный файл: нет такого файла или каталога
программа является частью набора тестов Xenomai, скомпилированного из Linux PC в Linux + Xenomai ARM toolchain.
# 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
Edit: хорошо ,я не заметил.1 в конце было частью имени файла. Что это вообще значит?
17 ответов
обновление
Хотя то, что я пишу ниже, верно как общий ответ об общих библиотеках, я думаю, что наиболее частой причиной таких сообщений является то, что вы установили пакет, но не установили версию "-dev" этого пакета.
Ну, это не вранье - нет libpthread_rt.so.1
в этот список. Вероятно, вам нужно повторно настроить и перестроить его, чтобы он зависел от библиотеки, которую вы имеете, или установить все, что предоставляет libpthread_rt.so.1
.
в целом, цифры после .так номера версий, и вы будете часто обнаруживают, что они являются символическими ссылками друг с другом, поэтому если у вас версия 1.1 libfoo.таким образом, вы будете иметь реальный libfoo файл.так.1.0, и симлинки ФОО.так и Foo.так.1 указывая на libfoo.так.1.0. И если вы установите версию 1.1, не снимая другой, вы будете иметь libfoo.так.1.1, и libfoo.так.1 и libfoo.так что теперь будет указывать на новый, но любой код, который требует конкретной версии можно использовать в libfoo.так.1.Файл 0. Код, который просто полагается на API версии 1, но не заботится о том, что это 1.0 или 1.1, укажет libfoo.Итак.1. As orip указано в комментариях, это хорошо объясняется в http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html.
в твоем случае, ты может уйти с symlinking 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
если нет ничего, чтобы отображаться, добавьте значение пути по умолчанию (или нет, если вы хотите to)
$ 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.Итак.conf и в доверенных каталогах (/lib и / usr / lib).
обычно ваш менеджер пакетов позаботится об этом при установке новой библиотеки, но не всегда, и не помешает запустить ldconfig, даже если это не ваша проблема.
пакет Dev или неправильная версия
если это не сработает, я бы также проверить предложение Павла и найдите версию библиотеки" - 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:
ССЗ -я/usr/местные/включать ХХХ.с-о ХХХ -л/usr/местные/библиотека - Wl, - R/usr/local/lib
часть-Wl, - R сообщает результирующему двоичному файлу также искать библиотеку в/usr/local /lib во время выполнения, Прежде чем пытаться использовать один в/usr/lib/
надеюсь, это поможет вам.
linux.org справочная страница объясняет механику, но не объясняет никакой мотивации за ней : - (
об этом см. Sun Linker и библиотеки руководство
кроме того, обратите внимание, что "внешнее управление версиями" в значительной степени устарело в Linux, поскольку символьное управление версиями (расширение GNU) позволяет иметь несколько несовместимых версий одной и той же функции для присутствия в одной библиотеке. Это расширение позволило glibc иметь тот же внешний версия: libc.so.6
за последние 10 лет.
попробуйте добавить LD_LIBRARY_PATH
, который указывает пути поиска, к вашему
LD_LIBRARY_PATH=path_to_your_library
это работает!
cd /home/<user_name>/
sudo vi .bash_profile
добавить эти строки в конце
LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH
другое возможное решение в зависимости от ситуации.
Если вы знаете, что libpthread_rt.Итак.1 совпадает с libpthread_rt.таким образом, вы можете создать символическую ссылку по:
ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1
затем ls -l /lib
теперь должна отображаться символическая ссылка и то, на что она указывает.
все, что мне нужно было бежать:
sudo apt-get install libfontconfig1
Я был в папке, расположенной на /usr/lib/x86_64-linux-gnu
и это сработало отлично.
Если вы используете приложение в Microsoft Windows, путь к динамическим библиотекам (.dll) необходимо определить в переменной среды PATH.
Если вы используете приложение в UNIX, путь к вашим динамическим библиотекам (.so) необходимо определить в переменной среды LD_LIBRARY_PATH.
у меня была аналогичная ошибка, и она не исправлена с предоставлением LD_LIBRARY_PATH в~/.bashrc следующее . Что решило мою проблему, добавив .conf файл и загрузить его. Перейдите в терминал в СУ.
gedit /etc/ld.so.conf.d/myapp.conf
добавить путь к библиотеке в этот файл и сохраните.(например: / usr / local / lib). Для активации path необходимо выполнить следующую команду:
ldconfig
Проверьте Свой Новый Путь К Библиотеке:
ldconfig -v | less
Если это показывает ваши файлы библиотеки, то вы хорошо идти.
У меня была эта ошибка при запуске моего приложения с Eclipse CDT на Linux x86. Чтобы исправить это:
- в Eclipse: запуск > конфигураций > среда
- переменной LD_LIBRARY_PATH=/my_lib_directory_path
ошибка возникает, поскольку система не может ссылаться на упомянутый файл библиотеки. Выполните следующие действия:
- под управлением
locate libpthread_rt.so.1
будет указан путь ко всем файлам с этим именем. Предположим, что путь/home/user/loc
. - скопируйте путь и запустите
cd home/USERNAME
. Замените имя пользователя именем текущего активного пользователя, с которым вы хотите запустить файл. - Run
vi .bash_profile
и в конце
Я получил эту ошибку, и я думаю, что это та же причина вашего
error while loading shared libraries: libnw.so: cannot open shared object
file: No such file or directory
попробуйте это. Fix разрешения файлы:
cd /opt/Popcorn (or wherever it is)
chmod -R 555 * (755 if not ok)
chown -R root:root *
"sudo su", чтобы получить разрешения на вашу файловую систему.
Я получил эту ошибку, и я думаю, что это та же причина вашего
ошибка при загрузке общих библиотек: libnw.итак: не удается открыть общий доступ объектный файл: нет такого файла или каталога
попробуйте это. Исправить разрешения на файлы:
cd /opt/Popcorn (or wherever it is)
chmod -R 555 * (755 if not ok)