2015-02-24 2 views
0

В настоящее время я начинаю работать с общими библиотеками под Linux (OpenSuse). Общие библиотеки, которые я пишу, используются кучей небольших программ, которые предоставляют некоторые инструменты для электротехники. Таким образом, библиотеки очень специфичны. Поэтому я хотел бы сохранить программы и общие библиотеки в домашнем каталоге пользователей.Общие библиотеки в папке проекта

До сих пор я добавил путь к папке проекта /etc/ld.so.conf, который отлично работает. Есть только две проблемы.

Во-первых, пользователю необходимы права root для изменения содержимого ld.so.conf, которого я бы хотел избежать. Для пользователя должно быть как можно проще запускать программное обеспечение.

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

Есть ли способ добавить путь к динамическому компоновщику без привилегий root (я собираюсь запустить мое приложение из сценария, который ранее добавляет текущий путь к динамическому компоновщику)?

ответ

1

Позвольте пользователю изменить /etc/ld.so.conf, определенно, не путь.

Простой альтернативой было бы переопределить LD_LIBRARY_PATH в файле инициализации оболочки пользователя (.bashrc, ...) или более глобально в/etc/environment.

Пример: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/YOUR_SHARED_LIB_PATH

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

Но не рекомендуется, поскольку он не является гибким (ваш каталог перемещается, ...) и требует повторной компиляции.

+0

Спасибо, я думаю, что путь, использующий переменную LD_LIBRARY_PATH, является приемлемым способом. Теперь я запускаю свое приложение, используя следующий сценарий оболочки, который в настоящее время работает хорошо для меня. '#/бен/Баша PROGNAME = MyProg BASEDIR = $ (PWD) экспорта LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: $ BASEDIR DEPERROR = $ (LDD testeseries | Grep "не найдено") если! ["$ DEPERROR"!знак равно затем \t эхо "Dependency Ошибка:" \t эхо "Не удалось загрузить общие библиотеки, необходимые для $ PROGNAME" \t эхо $ DEPERROR еще \t ./$PROGNAME fi' – much

0

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

Вы также мог бы связать с чем-то вроде -Wl,-run-path

Read Drepper's paper: how to write shared libraries

BTW, вы должны решить для фиксированного места для библиотек, возможно $HOME/lib/ и избегать перемещения каталогов, содержащих их.

+0

Если он хочет переместить каталоги, rpath - [http://stackoverflow.com/questions/26943102/how-to-set-runpath-of-a-binary] - не поможет. –

Смежные вопросы