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

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


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

sudo apt-get install lib32z1


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

  1. в Eclipse: запуск > конфигураций > среда
  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.итак: не удается открыть общий доступ объектный файл: нет такого файла или каталога

попробуйте это. Исправить разрешения на файлы:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok)