Я устанавливаю программу на сервер как пользователь без прав 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