2015-06-20 2 views
3

Я создаю tmux-2.0 из источников на довольно регулярном хосте Linux. Первая попытка потерпела неудачу, поскольку оказалось, что установленная версия libevent старше, чем требуется, поэтому я начал сначала загружать и строить libevent-2.0.22 из источников (текущих на момент написания).Как создать программное обеспечение './configure && make && make install' против специальной библиотеки, которую я также создаю?

Строительство libevent удалось безупречно, и я думал, что я мог бы затем повторить попытку построения tmux со следующим:

PKG_CONFIG_PATH=$PATH_TO_MY_BUILT_LIBEVENT/lib/pkgconfig ./configure ... 

выше призывание удалось, так же последующее make и make install.

Запуск мой Новопостроенное tmux, однако, прерывается с отсутствующим общим объектом, не удивительно libevent-2.0.so.5:

tmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory 

Я думал, что здание с пользовательской библиотеки подразумевает также будет использоваться во время выполнения? ldd на моем tmux дает мне:

linux-vdso.so.1 => (0x00007fff8f5ff000) 
libutil.so.1 => /lib64/libutil.so.1 (0x0000003cf8800000) 
libncurses.so.5 => /lib64/libncurses.so.5 (0x0000003cf7e00000) 
libevent-2.0.so.5 => not found 
librt.so.1 => /lib64/librt.so.1 (0x0000003ce8600000) 
libresolv.so.2 => /lib64/libresolv.so.2 (0x0000003cea200000) 
libc.so.6 => /lib64/libc.so.6 (0x0000003ce7600000) 
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003cf7200000) 
libdl.so.2 => /lib64/libdl.so.2 (0x0000003ce7e00000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003ce8200000) 
/lib64/ld-linux-x86-64.so.2 (0x0000003ce7200000) 

Так, libevent-2.0.so.5 не найден.

Нужно ли мне прибегать к установке, я не знаю, LIBS, LDFLAGS или некоторые другие переменные или переключается на configure сценарий выше, так что, я не знаю, пути к моей недавно построенный libevent заделаны в tmux двоичный, любезно предоставлен ld?

I не имеет root access - университет Linux рабочая станция - и, откровенно говоря, мне он не нужен, я думаю. Я также не хочу гадать с LD_LIBRARY_PATH или тому подобное. Достаточно сказать, что LD_LIBRARY_PATH=$PATH_TO_MY_LIBEVENT/lib tmux отлично работает. Но я хочу, чтобы он работал «по умолчанию», найдя и используя мой libevent.

Я предполагаю, что решение применимо практически ко всем программным средствам, использующим «систему сборки GNU». Какая здесь правильная вещь?

+0

Я не знаю специфики для «tmux» или вашей среды Linux. Но в общем, вы бы 1) 'make clean': удалить текущие бинарные файлы; 2) './Configure': у GNU-сборки можно изменить настройки сборки для вашей среды. Предположительно, это должно обнаружить 'libevent-2.0.22'. Наконец, 3) 'make && make install': перестроить с нуля. – paulsm4

+0

Привет, paulsm4, почему вы уверены, что './Configure' (без переключателей, я предполагаю?) Должен обнаружить' libevent-2.0.22'? Я не ожидаю этого - я мог бы построить библиотеку где угодно, это не похоже на то, что сценарий выполняет рекурсивную находку, начиная с '/' или чего-то еще. Но он * должен * действительно использовать его *, если * я говорю ему использовать файлы 'pkg-config', проживающие по пути, указанному переменной' PKG_CONFIG_PATH', что я и сделал. Все строит отлично, просто встроенный двоичный файл не может найти библиотеку, которая, предположительно, была './configure'd! – amn

ответ

3

Вы построили библиотеку, но система не знает, где находится библиотека. Поскольку вы не хотите устанавливать библиотеку, а скорее оставляете ее там, где вы ее создали, вы можете решить ее с помощью опции -rpath= для компоновщика - it embeds a search path для библиотек в исполняемый файл.

Просто пересобрать приложение с его добавления в ваш LDFLAGS, как LDFLAGS="-rpath=/home/mypath/to/libevent"(но учтите, что это вариант линкер, и вполне возможно, что в Makefile, как компоновщик использовал сам GCC - НКУ не знает вариант, то вам нужно написать это как LDFLAGS="-Wl,-rpath=/home/mypath/to/libevent", чтобы заставить GCC передать параметр вплоть до фактического линкера)

Кстати, на самом деле вы можете изменить RPATH даже без перекомпиляции приложения - there's a tool patchelf для этой работы.

+1

«rpath» - это план B. Скорее всего, вероятность того, что «configure» должна автоматически обнаружить библиотеку. В противном случае «configure» может иметь параметр командной строки для принудительной установки параметров компоновщика (включая rpath). Ручное редактирование make-файлов (s) должно быть «последним средством». – paulsm4

+1

@ paulsm4 от обоих ваших комментариев Я думаю, вы прочитали вопрос невнимательно. Автор создал библиотеку, а затем приложение против этой библиотеки. И после того, как они запускают исполняемый файл, они, очевидно, получили сообщение о недостающей библиотеке. У них нет корневого доступа для установки встроенной библиотеки, и они не хотят обращаться с переменной LD_LIBRARY_PATH, поэтому изменение * rpath * остается единственным. –

+0

Очень полезно, спасибо, Привет-Ангел. Я не думаю, что значение 'tmux' фигурирует в этом, это могло произойти при построении любого программного обеспечения. .configure && make && make install или' autoconf'. И я думаю, что я могу уйти ** без ** необходимости касаться каких-либо make-файлов, что, по-видимому, по праву предлагает paulsm4, поскольку простой «план B» - './configure --help' говорит мне, что я могу предоставить все виды переменных среды , включая 'LIBS' и' LDFLAGS', я думаю, что один из них в сочетании с вашим советом должен иметь тот эффект, который я ищу. – amn

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