Ошибка Linux при загрузке общих библиотек: невозможно открыть файл общего объекта: нет такого файла или каталога - PullRequest
285 голосов
/ 26 января 2009

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

Ответы [ 17 ]

265 голосов
/ 17 января 2014

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

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

(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

127 голосов
/ 11 февраля 2015

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

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
125 голосов
/ 26 января 2009

Обновление
Хотя то, что я пишу ниже, верно в качестве общего ответа об общих библиотеках, я думаю, что наиболее частой причиной такого рода сообщений является то, что вы установили пакет, но не установили версию этого пакета «-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. Однако нет никаких гарантий, что он не нарушит ваш код и не поужинает на телевидении.

48 голосов
/ 12 февраля 2015

У меня была похожая ошибка, я мог ее исправить, дав

sudo ldconfig -v

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

20 голосов
/ 23 марта 2016

Необходимо убедиться, что вы указали путь к библиотеке во время ссылки при компиляции вашего файла .c:

gcc -I / usr / local / include xxx.c -o xxx -L / usr / local / lib -Wl, -R / USR / местные / Библиотека

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

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

12 голосов
/ 27 января 2009

Справочная страница linux.org объясняет механику, но не объясняет мотивы, стоящие за ней: - (

Об этом см. Sun Linker and Libraries Guide

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

10 голосов
/ 07 июля 2014

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

LD_LIBRARY_PATH=path_to_your_library

Работает!

7 голосов
/ 21 июня 2016
cd /home/<user_name>/
sudo vi .bash_profile

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

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH
4 голосов
/ 16 сентября 2015

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

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

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

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

3 голосов
/ 03 января 2018

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

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

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

ldconfig

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

ldconfig -v | less

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

...