我想在科学计算集群节点上使用 Tmux,但它在任何一个节点上都不可用环境模块我可以看到。所以我开始从源代码构建它,无需 root 访问权限。.configure
需要 libevent,所以我成功下载并在我的主目录中构建了 libevent 2.1。但是,我不知道如何在 Tmux 的配置脚本中指定 libevent。我怎样才能做到这一点?
注意:这个问题非常类似于为什么从源代码构建 tmux 时 gcc 找不到 libevent?,但我使用的是 libevent 2.1。
答案1
正如中提到的为什么从源代码构建 tmux 时 gcc 找不到 libevent?,没有with-libevent=dir
选择。因此在配置 Tmux 时请执行以下操作:
DIR="$HOME/path/to/libevent"
./configure CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/.libs"
请注意,这是.libs,而不是 lib。我认为这是 libevent 2.1 中的一个变化。
这将使它通过配置检查和编译。然而,你还没有走出困境。如果您只这样做,那么当您尝试运行时tmux
,您将收到此错误:
error while loading shared libraries: libevent-2.1.so.6: cannot open shared object file: No such file or directory
这篇博文有解决方案 - 将.libs
路径附加到LD_LIBRARY_PATH
,如下所示:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/path/to/libevent/.libs
现在,要使其在下次登录时“粘住”,请将上面的行粘贴到您的~/.bashrc
文件中。如果您仅在终端中运行该命令,它只会持续该会话。
答案2
您可以使用pkg-config
轻松做到这一点。
首先,构建libevent
.在此示例中,我们将安装
libevent
到/tmp/libevent
- 您不必手动创建此目录,它将在构建过程中自动创建。您无需成为 root 即可运行make install
:
$ ./autogen.sh
$ ./configure --prefix=/tmp/libevent
$ make
$ make install
你现在应该有/tmp/libevent/lib/pkgconfig/libevent.pc
:
$ cat /tmp/libevent/lib/pkgconfig/libevent.pc
#libevent pkg-config source file
prefix=/tmp/libevent
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: libevent
Description: libevent is an asynchronous notification event loop library
Version: 2.2.0-alpha-dev
Requires:
Conflicts:
Libs: -L${libdir} -levent
Libs.private:
Cflags: -I${includedir}
请注意,它prefix
设置为我们作为参数传递给 的目录./configure
。
在构建 tmux 之前/tmp/libevent/lib/pkgconfig
添加
PKG_CONFIG_PATH
:
$ export PKG_CONFIG_PATH=/tmp/libevent/lib/pkgconfig:$PKG_CONFIG_PATH
$ pkg-config --cflags --libs libevent
-I/tmp/libevent/include -L/tmp/libevent/lib -levent
然后tmux
正常构建:
$ ./autogen.sh
$ ./configure
$ make
请注意,为了真正开始tmux
您的自定义,
libevent
您必须LD_LIBRARY_PATH
正确设置:
$ ldd ./tmux
linux-vdso.so.1 (0x00007ffce3d92000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f2f1d77e000)
libncurses.so.5 => /lib64/libncurses.so.5 (0x00007f2f1d527000)
libevent-2.2.so.1 => not found
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f2f1d30b000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2f1cf42000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f2f1cd3d000)
/lib64/ld-linux-x86-64.so.2 (0x000055cdf0697000)
$ ./tmux
./tmux: error while loading shared libraries: libevent-2.2.so.1: cannot open shared object file: No such file or directory
$ LD_LIBRARY_PATH=/tmp/libevent/lib ./tmux -V
tmux master
编辑:
为了摆脱设置,LD_LIBRARY_PATH
您可以rpath
在构建时设置tmux
:
$ ./configure LDFLAGS="-Wl,-rpath=/tmp/libevent/lib"
$ make
$ ldd ./tmux
linux-vdso.so.1 (0x00007ffcc6de1000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fbe121a4000)
libncurses.so.5 => /lib64/libncurses.so.5 (0x00007fbe11f4c000)
libevent-2.2.so.1 => /tmp/libevent/lib/libevent-2.2.so.1 (0x00007fbe11cf7000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fbe11adc000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbe11712000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fbe1150e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbe112f1000)
/lib64/ld-linux-x86-64.so.2 (0x000055f057ef4000)
$ ./tmux -V
tmux master
答案3
即使安装了 libevent-2.1.so.7 后运行 tmux 时也遇到类似的问题。创建已安装文件到 /lib64/ 目录的符号链接对我有用。
$sudo ln -s /usr/local/lib/libevent-2.1.so.7.0.0 /lib/x86_64-linux-gnu/libevent-2.1.so.7
$ldd tmux
linux-vdso.so.1 (0x00007fff6f9fe000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f675b5eb000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f675b3c1000)
libevent-2.1.so.7 => /lib/x86_64-linux-gnu/libevent-2.1.so.7 (0x00007f675b16b000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f675af50000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f675ab5f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f675a940000)
/lib64/ld-linux-x86-64.so.2 (0x00007f675ba9f000)