如何使用自定义构建的 libevent 2.1 从源代码构建 Tmux,无需 root 访问权限?

如何使用自定义构建的 libevent 2.1 从源代码构建 Tmux,无需 root 访问权限?

我想在科学计算集群节点上使用 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)

相关内容