Установка библиотеки локально в домашний каталог, но программа ее не распознает

Установка библиотеки локально в домашний каталог, но программа ее не распознает

Я устанавливаю программу на сервер как пользователь без прав root. Конкретно это tmux 1.5, но, по моему мнению, это должно применяться ко всем локально установленным программам (я упоминаю название программы на случай, если эта проблема окажется не моей ошибкой).

Программа требует от меня установки некоторых зависимых библиотек (например, libevent и ncurses). Поэтому я установил их обе локально, так как у меня нет прав root

cd $HOME/library/installation/folder
DIR=$HOME/local
./configure --prefix=$DIR 
#... make ... make install 

Теперь, чтобы установить программу, мне также пришлось включить пакеты библиотек:

cd $HOME/program/installation/folder
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
#... make ... make install 

Итак, это устанавливает программу без проблем в $HOME/local/bin, но если я запускаю исполняемый файл: $HOME/local/bin/tmux, я получаю следующую ошибку:

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

Мне кажется, что программа не может найти нужные библиотеки, но файл libevent-2.0.so.5 действительно существует в $HOME/local/lib, как указано в параметрах конфигурации. Мне интересно, как заставить программу распознавать установленную библиотеку для запуска. Я пробовал помещать символические ссылки в $HOME/lib, $HOME/bin и $HOME/local/bin, но ни один из них не сработал. Буду очень признателен за любые идеи и предложения

решение1

Попробуйте пересобрать libevent с помощью

./configure --disable-shared

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

В качестве альтернативы, если вам необходим динамически связанный libevent, вы можете добавить каталог, содержащий libevent-2.0.so.5, в переменную среды LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}

решение2

Вы также можете установить RPATH, которыйкодирует патч поиска библиотеки в самом двоичном файле.

Просто добавьте -R $DIR/libк CFLAGS.

решение3

я спрашиваланалогичный вопрос, что довольно интересно, также касается сборки tmuxвсего, хотя я все еще уверен, что это не должно относиться практически к любой ситуации, когда GNU configureи makeиспользуются вместе.

Я считаю, что более чистый подход заключается в использовании так называемого "rpath" - пути поиска библиотеки, встроенного в двоичный файл. Переключатель, -rpathпо крайней мере, GNU linker ldпозволяет указать "rpath".

Тогда командная строка сборки будет выглядеть следующим образом:

PKG_CONFIG_PATH=/path/to/libevent/lib/pkg-config LDFLAGS=-Wl,-rpath,/path/to/libevent/lib ./configure ...

Не совсем первостепенно, но PKG_CONFIG_PATHвыше просто рекомендуемый способ сделать то, что люди иначе достигают вручную, отправляя -L/path/to/libevent/lib -I/path/to/libevent/includeв ./configureскрипт. Когда вы собираете libevent, он устанавливает свои собственные файлы конфигурации для pkg-config(который используется ./configure). Вы должны использовать его, потому что толькоlibevent определеннознает, какие переключатели следует использовать при строительстве против него.

В любом случае, в некоторых ситуациях -rpathэто более чистый подход к решению проблемы.

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

Странно, почему tmuxсобственные скрипты сборки не выводят этот путь из пути поиска библиотеки во время сборки. Может быть, им это не нужно и не следует, я не знаю. Совпадение ли, что это произошло с нами, которые строят tmux?

решение4

С остальными не повезло, но это сработало для меня, отздесь:

sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

Связанный контент