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

356

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

Заратустра
источник
277
Это может произойти, если вы недавно установили общую библиотеку и впоследствии не запускали ldconfig (8). Сделайте 'ldconfig', в этом нет никакого вреда.
AbiusX
25
+1 к комментарию @AbiusX - запуск sudo ldconfig (при условии, что библиотеки действительно находятся там, где они должны быть [/ usr / bin / lib /, / usr / bin / include /, / usr / local / lib / и / usr / local / include / AFAIK], пожалуйста, поправьте меня, если я ошибаюсь) может решить эту проблему. Ура!
АэроКросс 16.11.11
Обратите внимание, что эта ошибка также может возникать, если права доступа к вашему файлу lib были изменены каким-либо образом. Изменение разрешений обратно на 644 решило это для меня.
Джеффри Х

Ответы:

140

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

Пол Томблин
источник
5
... о боже, .1 является частью имени файла. Есть идеи, что это значит?
Заратустра
orip заслуживает +1 за эту ссылку. @ Если ты не возражаешь, @orip, я бы хотел добавить твою ссылку в ответ?
Пол Томблин
@PaulTomblin, я получаю похожую ошибку при ремонте grub. Можете ли вы помочь мне об этом? Этот вопрос -> askubuntu.com/questions/123275/cant-repair-grub/...
Эрай
@ TomNysetvold и Пол, да - это один и тот же документ.
orip
Я нашел много плохой информации и окольных решений в своем поиске этого ответа. Что-то внутри меня сказало мне продолжать поиск, пока я не найду решение с одной командой.
c ..
327

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

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

(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

XOR
источник
3
Вышеупомянутый ответ был очень ясным, прежде всего, спасибо. Я попытался сделать это в моем пути проекта Eclipse CDT (Lubuntu). / Debug $ echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "/home/akhil/HDE/x86.linux/lib" здесь мои библиотеки на самом деле доступны даже, но все равно я получаю ту же ошибку. Какие-либо предложения!
nahasapeemapetilon
12
Попробуйте выполнить команду "ldconfig" после экспорта вашей библиотеки. Вам может потребоваться выполнить эту команду как «sudo».
XOR
5
Все команды в шаге (1) могут быть выполнены в findодиночку:find / -name the_name_of_the_file.so
wbadart
3
Я считаю, что LD_LIBRARY_PATHследует указывать на каталог, содержащий path.so.something, а не на path.so.somethingсебя.
геррит
2
Следуя вашим командам, шаг за шагом решил мою проблему! Благодаря тонну!
Фишер Кодер
156

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

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
АМО
источник
3
По умолчанию / lib и / usr / lib, но не / usr / local / lib? Это сбило меня с толку несколько раз за мою карьеру и потраченные впустую часы.
ДаренВ
@DarenW Для меня работает с / usr / local / lib. Ubuntu 14.04 LTS.
gon1332
Добавление собственных .confфайлов с нестандартными путями lib, которые мне нужны /etc/ld.so.conf.d(на которые указывает /etc/ld.so.conf), помогло.
CivFan
4
+1 за необходимость запуска ldconfig. Я не использовал менеджер пакетов. Я должен был скомпилировать из источника, так что это было необходимо.
Джефф
7
это реальный ответ
Скотт
53

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

sudo ldconfig -v

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

Битин Алангот
источник
37
Привет, это вполне может решить проблему ... но было бы хорошо, если бы вы могли отредактировать свой ответ и дать небольшое объяснение о том, как и почему он работает :) Не забывайте - на переполнении стека есть куча новичков, и они могут выучить одну или две вещи из вашего опыта - то, что для вас очевидно, может быть не так для них.
Тарын Ист
Он не сможет объяснить это. Он просто скопировал свой ответ.
Jhourlad Estrella
повторяющийся ответ ... см. тот же ответ выше, созданный за день до этого
Скотт Стенсланд
25

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

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

TaoCHEN92
источник
3
Это вариант, который я искал. Возможно, лучше будет -Wl,-rpath DIR.
jrw32982 поддерживает Монику
1
Великий! Я столкнулся с этой проблемой, когда моя программа успешно скомпилирована с помощью cmake, но не может запуститься из-за ошибки. Этот ответ решил мою проблему
Иван Талалаев
15

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

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

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

Анкит Мароти
источник
13

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

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

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

Занятый русский
источник
7
cd /home/<user_name>/
sudo vi .bash_profile

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

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH
singingsingh
источник
5

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

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

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

ldconfig

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

ldconfig -v | less

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

Ананд Пол
источник
4

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

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

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

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

ALM865
источник
4

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

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

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

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

    LD_LIBRARY_PATH=/my_lib_directory_path
    
Майкл Файяд
источник
2

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

sudo apt-get install libfontconfig1

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

Jonny
источник
2

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

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

Рубенс Гомес
источник
1

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

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

zajac.m2
источник
1

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

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

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

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

Мохамад Усама
источник
0

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

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

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

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 
Салми Ахмед
источник
0

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

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

dnf reinstall libwbclient
МохамедАмин Самет
источник
0

Я использую 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
prabhugs
источник