Ошибки 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 251

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 file

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. 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

Если это показывает ваши файлы библиотеки, то вы хорошо идти.

попробуйте установить sudo lib32z1

sudo apt-get install lib32z1

У меня была эта ошибка при запуске моего приложения с Eclipse CDT на Linux x86. Чтобы исправить это:

  1. в Eclipse: Run as > Run Configuration > Environment
  2. LD_LIBRARY_PATH=/my_lib_directory_path

ошибка возникает, поскольку система не может ссылаться на указанный файл библиотеки. Выполните следующие действия:

  1. под управлением locate libpthread_rt.so.1 будет указан путь ко всем файлам с этим именем. Предположим, что путь /home/user/loc.
  2. скопируйте путь и запустите cd home/USERNAME. Замените имя пользователя на имя текущего активного пользователя, с которым вы хотите запустить файл.
  3. 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)