Я устанавливаю программу на сервер как пользователь без полномочий 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, но ни одна из них не сработала. Любые идеи и предложения будут с благодарностью
источник
-R $DIR/lib
чтоCFLAGS
это во время строительстваtmux
(а неlibevent
). Это не помогло мне - была последняя ошибка от gcc, говорящая, что он не может распознать-R
(также я пробовал без пробела между-R
и$DIR
). ./configure --disable-shared Это сработало, обновлениеLD_LIBRARY_PATH
также сработало. Я закончил тем, что сделалlibevent
снова с вышеупомянутым--disable-shared
выбором.Ответы:
Попробуйте перестроить libevent, используя
Я подозреваю, что это решит вашу проблему, потому что библиотека будет связана с при сборке двоичного файла и не нуждается в поиске во время выполнения.
В качестве альтернативы, если вам нужен динамически связанный libevent, вы можете добавить содержащий каталог libevent-2.0.so.5 в переменную среды LD_LIBRARY_PATH:
источник
Вы также можете установить RPATH, который кодирует патч поиска библиотеки в самом двоичном файле .
Просто добавьте
-R $DIR/lib
вCFLAGS
.источник
Не повезло с другими, но это сработало для меня, отсюда :
источник
Я задал аналогичный вопрос , достаточно интересно, также о построении
tmux
всех вещей (хотя я все еще уверен, что это относится практически к любой ситуации, когда GNUconfigure
иmake
используются вместе.Я считаю, что более чистый подход заключается в использовании так называемого «rpath» - пути поиска библиотеки, встроенного в двоичный файл.
-rpath
Переключатель по крайней мере GNU линкерld
указывает путь.Командная строка сборки будет выглядеть следующим образом:
Не очень первостепенные здесь, но
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
?источник