Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: [Решено:]Не видны библиотеки, подключённые &#  (Прочитано 1895 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Nomadian

  • Автор темы
  • Участник
  • *
  • Сообщений: 232
    • Просмотр профиля
Ситуация специфическая, поэтому по порядку:

В рабочей сети есть примерно десяток Ubuntu-машин, где крутится один и тот же софт собственной разработки. Для запуска используются опять же собственные библиотеки. И то, и другое регулярно обновляется. Необходимость бегать с флешкой по десяти машинам, заменяя файлы или линки достала всех  :-\.

Чтобы решить проблему:
 - поднял nfs-сервер (Ubuntu 9.10 server)
 - на клиентах (Ubuntu 9.10 desktop):
      - подключил nfs-каталоги /myapps и /mylibs.
      - добавил в /etc/profile строки, чтобы /mylibs попала в $PATH. Перелогинился: при проверке - echo $PATH - /mylibs присутствует.

Однако, при запуске на клиенте приложения /myapps/clientApplication происходит сбой, с сообщением:
error while loading shared libraries: netLib.4.2.so: cannot open shared object file: No such file or directory
При этом:
  - netLib.4.2.so - это именно наша библиотека
  - на клиенте она прекрасно видна в папке /mylibs (для проверки её "на раз" находит find / -name netLib.4.2.so)

Что не так? $PATH не распространяется на поиск библиотек? Надо делать какие-то особые линки?

Заранее благодарен.

P.S.: Искать пробовал, прочитал тучу всего про $PATH, но с этим-то, похоже, проблем нет  :-[.

Решение:

Принцип: В действительности, поиск библиотек  Linux впроисходит не через $PATH (которая нужна только для поиска приложений).
Перечень подключаемых библиотек в Linux содержится в файле /etc/ld.so.conf, однако, в Ubuntu там одна строка: include /etc/ld.so.conf.d/*.conf, которая собственно, и определяет описанный метод...

1. Идём в каталог /etc/ld.so.conf.d/ - это место, где лежат файлы с расширением .conf, в которых перечислены каталоги для поиска библиотек

2. Создаём файл /etc/ld.so.conf.d/mylibs.conf (имя произвольное, главное - расширение .conf)
sudo nano /etc/ld.so.conf.d/mylibs.conf
3. Вписываем путь к каталогу библиотек. В моём случае - /mylibs.

4. Запускаем конфигуратор библиотек:
sudo ldconfig
5. Выходим/заходим, хотя, это и не обязательно.
« Последнее редактирование: 15 Апреля 2010, 04:09:14 от Nomadian »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Либо можно задать переменные среды LD_LIBRARY_PATH (и LD_PRELOAD - чтобы ее сразу загрузить)
А команда
ldd /path/to/fileпокажет, какие библиотеки требует указанный файл (исполняемый или .so) и откуда именно они берутся.

И все это, а еще многое другое, написано в man ld.so .... Как выяснилось. :)
« Последнее редактирование: 15 Апреля 2010, 09:19:21 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Nomadian

  • Автор темы
  • Участник
  • *
  • Сообщений: 232
    • Просмотр профиля
LD_LIBRARY_PATH и LD_PRELOAD работают только из строки запуска приложения, а мне было необходимо настроить библиотеки для запуска многих приложений "без заморочек".

P.S.: man ld.so я читал  :coolsmiley:. Там, действительно, много очень интересного...

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Ну дыкть, в инит-скрипте или в /etc/rc.local прописываем эту переменную, и имеем щяссе
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

 

Страница сгенерирована за 0.029 секунд. Запросов: 23.