Ошибки 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.so. 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
если ничего не отображается, добавьте значение пути по умолчанию (или нет, если хотите к)
$ 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". Многие библиотеки разделены на пакеты 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, поскольку symbol versioning (расширение GNU) позволяет иметь несколько несовместимых версий одной и той же функции в одной библиотеке. Это расширение позволило glibc иметь тот же внешний версия:
libc.so.6
за последние 10 лет.
попробуйте добавить
LD_LIBRARY_PATH
, который указывает пути поиска, к вашему~/.bashrc
fileLD_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. so. 1-это то же самое, что libpthread_rt.so затем вы можете создать символическую ссылку:
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: Run as > Run Configuration > Environment
- 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.so: не удается открыть общий доступ объектный файл: нет такого файла или каталога
попробуйте это. Исправить разрешения на файлы:
cd /opt/Popcorn (or wherever it is) chmod -R 555 * (755 if not ok)