Помилка 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 / включити / AFAIK], будь ласка, виправте мене, якщо я помиляюся) може вирішити цю проблему. Ура!
AeroCross

Зауважте, що ця помилка також може виникнути, якщо дозволи на ваш файл lib якимось чином змінилися. Зміна дозволів назад на 644 вирішила це для мене.
Джеффрі Н

Відповіді:


139

Оновлення
Хоча те, що я пишу нижче, відповідає дійсності як загальна відповідь про спільні бібліотеки, я вважаю, що найбільш частою причиною подібних типів повідомлень є те, що ви встановили пакет, а не встановили "-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 є частиною імені файлу. Будь-яка ідея, що це означає?
zaratustra

orip заслуговує +1 за це посилання. Якщо ви не заперечуєте, @orip, я хотів би поставити ваше посилання у відповідь?
Пол Томблін

@PaulTomblin, я отримую подібну помилку під час ремонту grub. Ви можете мені допомогти з цього приводу? Це питання -> askubuntu.com/questions/123275/cant-repair-grub/…
Eray

@TomNysetvold і Пол, так - це той самий документ.
orip

У пошуках цієї відповіді я натрапив на багато поганої інформації та кругових рішень. Щось усередині мене сказало мені продовжувати пошук, поки не знайду рішення з однокомандними командами.
с ..

326

Ваша бібліотека - це динамічна бібліотека. Вам потрібно повідомити операційній системі, де вона може знайти її під час виконання.

Для цього нам потрібно буде виконати такі прості кроки:

(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
Вищезгадана відповідь була дуже зрозумілою, насамперед дякую. Я спробував це зробити у своєму проекті Eclipse CDT Project Path (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
втор

3
Я вважаю, що LD_LIBRARY_PATHслід вказувати на каталог, який містить path.so.somethingне path.so.somethingсебе.
gerrit

2
Дотримуючись ваших команд крок за кроком вирішив мою проблему! Дякую тонну!
Fisher Coder

156

Ось декілька рішень, які можна спробувати:

ldconfig

Як зазначав AbiusX: Якщо ви тільки що встановили бібліотеку, вам може знадобитися просто запустити ldconfig .

sudo ldconfig

ldconfig створює необхідні посилання та кеш на останні спільні бібліотеки, знайдені в каталогах, зазначених у командному рядку, у файлі /etc/ld.so.conf та у довірених каталогах (/ lib та / usr / lib).

Зазвичай менеджер пакунків про це подбає, коли ви встановите нову бібліотеку, але не завжди, і запустити ldconfig навіть не завадить, якщо це не ваша проблема.

Пакет Dev або неправильна версія

Якщо це не спрацює, я також перевірив би пропозицію Павла та шукав "-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

@DarenW Для мене працює з / usr / local / lib. Ubuntu 14.04 LTS.
gon1332

Додавання .confвласних файлів з нестандартними контурами до мене, на які мені потрібно /etc/ld.so.conf.d(на що вказував /etc/ld.so.conf), зробила трюк.
CivFan

4
+1 за необхідність запустити ldconfig. Я не використовував менеджера пакунків. Мені довелося компілювати з джерела, тому це було необхідно.
Джефф

7
це справжня відповідь
Скотт Стенсленд

53

У мене була подібна помилка, я можу її усунути, подавши,

sudo ldconfig -v

Сподіваюсь, це допомагає.


37
Привіт, це цілком може вирішити проблему ... але було б добре, якби ви могли відредагувати свою відповідь і дати невелике пояснення про те, як і чому це працює :) Не забувайте - на купі переповнення Stack є купа новачків, і вони могли б дізнатися щось чи дві з вашої експертизи - те, що вам очевидно, може бути не таким для них.
Тарін Схід

Він не зможе пояснити це. Він просто скопіював свою відповідь.
Jhourlad Estrella

дублюючу відповідь ... див. таку ж відповідь вище, створену за день до цього
Скотт

25

Потрібно переконатися, що ви визначаєте шлях бібліотеки під час посилання під час компілювання файлу .c:

gcc -I / usr / local / включають xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / local / lib

Частина -Wl, -R повідомляє отриманому бінарному файлу також шукати бібліотеку в / usr / local / lib під час виконання, перш ніж намагатися використовувати цю в / usr / lib /

Сподіваюся, це допоможе вам.


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

Крім того, зауважте, що "зовнішня версія" значною мірою застаріла в 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

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слід показати симпосилання і на що воно вказує.


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і вона працювала чудово.


2

Якщо ви запускаєте свою програму в Microsoft Windows, шлях до динамічних бібліотек (.dll) потрібно визначити в змінній середовища PATH.

Якщо ви запускаєте свою програму в UNIX, шлях до ваших динамічних бібліотек (.so) повинен бути визначений у змінній середовища LD_LIBRARY_PATH.



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. Закрийте термінал і перезавантажте програму. Він повинен бігти.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.