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

Программа является частью набора тестов Xenomai, кросс-скомпилированного из ПК с Linux в набор инструментов Linux+Xenomai ARM.

# 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 в конце был частью имени файла. Что это значит?

22 ответа

Решение

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


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

Как правило, числа после.so являются номерами версий, и вы часто обнаруживаете, что они являются символическими ссылками друг на друга, поэтому, если у вас версия libfoo.so версии 1.1, у вас будет настоящий файл 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. Как указал orip в комментариях, это хорошо объясняется на http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html.

В вашем случае, вы можете сойти с ссылки 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 и 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:

gcc -I / usr / local / include xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / local / lib

Часть -Wl, -R сообщает результирующему двоичному файлу также, что нужно искать библиотеку в / usr / local / lib во время выполнения, прежде чем пытаться использовать библиотеку в / usr / lib /

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

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

LD_LIBRARY_PATH=path_to_your_library

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

Справочная страница linux.org объясняет механику, но не объясняет мотивацию этого:-(

Для этого, смотрите Sun Linker и Библиотеки Guide

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

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

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

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

Хотел добавить, если у ваших библиотек нестандартный путь, запустите ldconfig следует путь.

Например, мне пришлось бежать:

sudo ldconfig /opt/intel/oneapi/mkl/2021.2.0/lib/intel64

для компиляции R с Intel MKL

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

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

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

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

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

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

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

ldconfig

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

ldconfig -v | less

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

Бег:

      sudo ldconfig

было достаточно, чтобы решить мою проблему.

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

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

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

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

    LD_LIBRARY_PATH=/my_lib_directory_path
    

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

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

Я использую Ubuntu 18.04

У меня сработала установка соответствующего пакета "-dev",

sudo apt install libgconf2-dev

Я получал ошибку ниже, пока не установил указанный выше пакет,

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory

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

sudo apt-get установить lib32z1

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

sudo apt-get install libfontconfig1

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

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

  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. Закройте терминал и перезапустите приложение. Это должно бежать.

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

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

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

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

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

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

dnf reinstall libwbclient

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

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", чтобы получить разрешения для вашей файловой системы.

Вы можете прочитать о библиотеках здесь:https://domiyanyue.medium.com/c-development-tutorial-4-static-and-dynamic-libraries-7b537656163e

Другие вопросы по тегам