10

Я устанавливаю программу на сервер как пользователь без полномочий 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, но ни одна из них не сработала. Любые идеи и предложения будут с благодарностью

4 ответа4

18

Попробуйте восстановить Libvent, используя

./configure --disable-shared

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

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

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

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

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

2

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

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

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

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 to ./configure Когда вы libevent , он устанавливает свои собственные файлы конфигурации для pkg-config (который используется ./configure). Вы должны использовать его, потому что только libevent определенно знает, какие переключатели следует использовать при построении против него.

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

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

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

2

Не повезло с другими, но это сработало для меня, отсюда:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .