Використовуйте спільні бібліотеки в / usr / local / lib


58

Я створив деякі бібліотеки з джерел, а файли після make install- у/usr/local/lib

Наприклад, у моєму випадку у мене є файл, libodb-2.2.soякий знаходиться в цьому каталозі.

Однак, коли я запускаю виконуваний файл, з яким пов’язаний libodb, я отримав помилку: помилка під час завантаження спільних бібліотек:libodb-2.2.so: cannont open shared object file: No such file or directory.

Це означає, що я створив свій виконуваний файл неправильно? чи я повинен зазначити системі, що в папці можуть бути і якісь цікаві вкладки /usr/local/lib?

Я використовую Ubuntu 12.04, Linux ядро ​​3.2.0-38-generic.



Я настійно пропоную вам створити добрі стосунки з дружбою
DDS,

@DDS Я пропоную вам розробити трохи більше. Ви знаєте, що це спільний веб-сайт. Вкажіть, будь ласка, вкажіть, як gdb, наприклад, допомогло б у будь-якому випадку linkпроблема. Мені справді цікаво. Спочатку ваше зауваження мені здається не пов'язаним із проблемою. Але я можу помилятися. Дійсно, я не знаю достатньо gdbі завантаження бібліотек.
Стефан Ролланд

Вибачте ... цей коментар повинен був бути розміщений на stackoverflow на запитання учня про програмування на C ... щойно не бачив, було U&L
DDS

@DDS Новачок у навчанні програмуванню на C або в навчанні будувати на Linux? Будь ласка, будьте точнішими. Наприклад, я приїжджав з Windows. Це не означає, що я не знаю С ++ ... Я схильний вважати, що ваша поведінкова поведінка не є точною. Навіть якби це було на SO, ваша поведінка незабаром приверне увагу модераторів. Будьте в курсі цього. Ви перебуваєте на сайті КОЛОБОРАТИВНОГО ентузіаста програмістів, які діляться корисними знаннями. Не десь дизайн, щоб улещити своє его. (Не хвилюйтеся, я теж м'яко / розумно бився, коли я почав так, і я думаю, що це було дійсно гарна річ).
Стефан Ролланд

Відповіді:


58

Для поточного сеансу ви можете

експортувати LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

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

Якщо у вас все ще виникають проблеми, біг ldd [executable name]покаже вам бібліотеки, які він намагається знайти, а яких - неможливо знайти.


3
Зі manсторінки для ldd(1)"У звичайному випадку, ldd викликає стандартний динамічний лінкер (див. ld.so(8)) Із LD_TRACE_LOADED_OBJECTSзмінною середовища, встановленою на 1, що призводить до того , що лінкер відображає залежність бібліотеки. Однак майте на увазі, що в деяких випадках деякі версії lddможуть . спробувати отримати інформацію про залежності, безпосередньо виконуючи програму Таким чином, ви ніколи не повинні наймати lddна ненадійному виконуваним ., так як це може привести до виконання довільного коду безпечної альтернатива при роботі з ненадійними виконуваними файлами є: ... »
SlySven

4
"... $ objdump -p /path/to/program | grep NEEDED"
SlySven

Хороший - я ніколи раніше не стикався з обідпупом.
Flup

Відповідно до цієї статті, ця відповідь є канонічно неправильною та шкідливою . Для правильного підходу використання -Lта -rpathпід час компіляції для встановлення зв’язкового шляху пошуку та маршруту пошуку для бібліотек є правильним способом відповідно до цього питання та відповіді.
Кліфф Армстронг,

37

Якщо ви вже бігли ldconfigпісля побудови бібліотеки, продовжуйте читати. Якщо ні, то спочатку прочитайте aboout ldconfig .

/usr/local/libможе не бути в бібліотечному шляху, який використовує ldconfig. Ви можете просто зробити це:

ldconfig /usr/local/lib

І матеріал слід додати до кеша лінкера, але, мабуть, краще додати шлях належним чином. Переконайтеся, що у вас є /etc/ld.so.conf.dкаталог. Якщо так, додайте файл (назвіть його "usr-local.conf", чи будь-що інше), і введіть у нього один рядок:

/usr/local/lib

Тепер біжи ldconfig. Якщо у вас немає каталогу ld.so.conf.d, у вас повинен бути /etc/ld.so.conf файл, і ви можете додати цей рядок до кінця.


3
Я додав файл custom.conf, щоб /etc/ld.so.conf.dпотім надіслати ldconfig, щоб врахувати його, і мій виконуваний файл може запуститися зараз.
Стефан Ролланд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.