Ошибка Linux при загрузке разделяемых библиотек: невозможно открыть файл общих объектов: нет такого файла или каталога

Программа является частью набора тестов Xenomai, скомпилированного с ПК Linux в 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                                 

Изменить: ОК. Я не заметил, что .1 в конце был частью имени файла. Что это значит в любом случае?

Ответ 1

Обновить
Хотя то, что я пишу ниже, верно в качестве общего ответа об общих библиотеках, я думаю, что наиболее частой причиной такого рода сообщений является то, что вы установили пакет, но не установили "-dev версию этого пакета".


Ну, это не вранье - в этом листинге нет libpthread_rt.so.1. Вам, вероятно, нужно переконфигурировать и перестроить его так, чтобы оно зависело от имеющейся у вас библиотеки, или установить то, что предоставляет libpthread_rt.so.1.

Как правило, числа после .so являются номерами версий, и вы часто обнаруживаете, что они являются символическими ссылками друг на друга, поэтому, если у вас есть версия 1.1 libfoo.so, у вас будет настоящий файл libfoo.so.1.0, и символические ссылки foo.so и foo.so.1, указывающие на libfoo.so.1.0. И если вы установите версию 1.1, не удаляя другую, у вас будет libfoo.so.1.1, а libfoo.so.1 и libfoo.so теперь будут указывать на новую, но любой код, для которого требуется эта точная версия, может используйте файл libfoo.so.1.0. Код, который опирается только на API версии 1, но не заботится, будет ли он 1.0 или 1.1, указывать libfoo.so.1. Как отметил Орип в комментариях, это хорошо объясняется на http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html.

В вашем случае, вы можете сойти с символической ссылки libpthread_rt.so.1 на libpthread_rt.so. Однако нет никаких гарантий, что это не нарушит ваш код и не поужинает на телевидении.

Ответ 2

Ваша библиотека является динамической библиотекой. Вы должны сообщить операционной системе, где она может найти его во время выполнения.

Для этого нам понадобятся следующие простые шаги:

(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

Ответ 3

Вот несколько решений, которые вы можете попробовать:

LDCONFIG

Как отметил AbiusX: если вы только что установили библиотеку, вам просто нужно запустить ldconfig.

sudo ldconfig

ldconfig создает необходимые ссылки и кеширует самые последние общие библиотеки, найденные в каталогах, указанных в команде line в файле /etc/ld.so.conf и в доверенных каталогах (/lib и /usr/lib ).

Обычно ваш менеджер пакетов позаботится об этом при установке новой библиотеки, но не всегда, и это не помешает запустить ldconfig, даже если это не ваша проблема.

Dev-пакет или неправильная версия

Если это не сработает, я также рассмотрю предложение Paul и поискать версию библиотеки "-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

Ответ 4

У меня была аналогичная ошибка, я мог бы разрешить ее, указав

sudo ldconfig -v

Надеюсь, это поможет.

Ответ 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.org объясняет механику, но не объясняет мотивацию: - (

Для этого см. Руководство Sun Linker and Libraries

Кроме того, обратите внимание, что "внешнее управление версиями" в значительной степени устарело в Linux, поскольку управление версиями символов (расширение GNU) позволяет вам иметь несколько несовместимых версий одной и той же функции в одной библиотеке. Это расширение позволило glibc иметь ту же внешнюю версию: libc.so.6 за последние 10 лет.

Ответ 7

Попробуйте добавить LD_LIBRARY_PATH, который указывает пути поиска, в ваш файл ~/.bashrc

LD_LIBRARY_PATH=path_to_your_library

Оно работает!

Ответ 8

cd /home/<user_name>/
sudo vi .bash_profile

добавить эти строки в конец

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH

Ответ 9

Другое возможное решение в зависимости от вашей ситуации.

Если вы знаете, что libpthread_rt.so.1 совпадает с libpthread_rt.so, вы можете создать символическую ссылку:

ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1

Затем ls -l /lib должен теперь показать символическую ссылку и то, на что она указывает.

Ответ 10

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

  1. В Затмении:

    Выполнить как → Выполнить настройки → Среда

  2. Установить путь

    LD_LIBRARY_PATH=/my_lib_directory_path
    

Ответ 11

У меня была похожая ошибка, и она не устранилась с выдачей LD_LIBRARY_PATH в ~/.bashrc. Что решило мою проблему, добавив файл .conf и загрузив его. Перейти к терминалу и быть в Су.

gedit /etc/ld.so.conf.d/myapp.conf

Добавьте путь к вашей библиотеке в этом файле и сохраните его (например,/usr/local/lib). Вы должны выполнить следующую команду, чтобы активировать путь:

ldconfig

Проверьте ваш новый путь к библиотеке:

ldconfig -v | less

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

Ответ 12

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

sudo apt-get install lib32z1

Ответ 13

Все, что мне нужно было сделать, было запущено:

sudo apt-get install libfontconfig1

Я был в папке, расположенной в /usr/lib/x86_64-linux-gnu, и работал отлично.

Ответ 14

Если вы запускаете приложение в Microsoft Windows, путь к динамическим библиотекам (DLL) должен быть определен в переменной среды PATH.

Если вы запускаете приложение в UNIX, путь к динамическим библиотекам (.so) должен быть определен в переменной среды LD_LIBRARY_PATH.

Ответ 15

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

  1. При запуске locate libpthread_rt.so.1 будет locate libpthread_rt.so.1 путь ко всем файлам с этим именем. Предположим, что путь это /home/user/loc.
  2. Скопируйте путь и запустите cd home/USERNAME. Замените USERNAME на имя текущего активного пользователя, с которым вы хотите запустить файл.
  3. Запустите vi.bash_profile и в конце параметра LD_LIBRARY_PATH, прямо перед . , добавьте строку /lib://home/usr/loc:. , Сохраните файл.
  4. Закройте терминал и перезапустите приложение. Это должно бежать.

Ответ 16

Я получил эту ошибку, и я думаю, что это та же самая причина, по которой вы

error while loading shared libraries: libnw.so: cannot open shared object 
file: No such file or directory

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

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

"sudo su", чтобы получить разрешения для вашей файловой системы.

Ответ 17

Я получил эту ошибку, и я думаю, что это та же самая причина, по которой вы

ошибка при загрузке общих библиотек: libnw.so: невозможно открыть файл общего объекта: такого файла или каталога нет

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

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

Ответ 18

похожая проблема найдена здесь: https://bugzilla.redhat.com/show_bug.cgi?id=1456202 Я пробовал упомянутое решение, и оно на самом деле работает.

Решения в предыдущих вопросах могут работать. Но я думаю, что это простой способ исправить это. Попробуйте переустановить пакет libwbclient в fedora:

dnf reinstall libwbclient