如何针对我也构建的自定义库构建“./configure && make && make install”软件?
How to build a './configure && make && make install' software against a custom library which I also build?
我正在 tmux-2.0
中从一个非常普通的 Linux 主机上的源构建。第一次尝试失败,因为安装的 libevent
版本比要求的版本旧,所以我首先从源代码(在撰写本文时为当前版本)下载并构建 libevent-2.0.22
。
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
?
提供
我 没有 root 访问权限 - 大学 Linux 工作站 - 坦率地说,我认为我不需要。我也不想乱用 LD_LIBRARY_PATH
之类的东西。可以说,LD_LIBRARY_PATH=$PATH_TO_MY_LIBEVENT/lib tmux
工作正常。但我希望它能够工作 "by default",定位并使用我的 libevent
。
我想这个解决方案几乎适用于所有使用 "GNU build system" 的软件。在这里正确的做法是什么?
您是针对一个库构建的,但系统不知道该库在哪里。由于您不想安装该库,而是将其留在您构建它的地方,您可以使用链接器的 -rpath=
选项解决它 - it embeds a search path 将库放入可执行文件中。
只需重建您的应用程序并将其添加到您的 LDFLAGS,例如 LDFLAGS="-rpath=/home/mypath/to/libevent"
(但请注意,它是一个链接器选项,并且有可能在 makefile 中作为链接器使用gcc 本身——gcc 不知道这个选项,那么你需要像 LDFLAGS="-Wl,-rpath=/home/mypath/to/libevent"
这样写来强制 gcc 将选项传递给实际的链接器)
顺便说一下,实际上您可以更改 rpath,甚至无需重新编译应用程序 — there's a tool patchelf 完成该工作。
我正在 tmux-2.0
中从一个非常普通的 Linux 主机上的源构建。第一次尝试失败,因为安装的 libevent
版本比要求的版本旧,所以我首先从源代码(在撰写本文时为当前版本)下载并构建 libevent-2.0.22
。
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
?
我 没有 root 访问权限 - 大学 Linux 工作站 - 坦率地说,我认为我不需要。我也不想乱用 LD_LIBRARY_PATH
之类的东西。可以说,LD_LIBRARY_PATH=$PATH_TO_MY_LIBEVENT/lib tmux
工作正常。但我希望它能够工作 "by default",定位并使用我的 libevent
。
我想这个解决方案几乎适用于所有使用 "GNU build system" 的软件。在这里正确的做法是什么?
您是针对一个库构建的,但系统不知道该库在哪里。由于您不想安装该库,而是将其留在您构建它的地方,您可以使用链接器的 -rpath=
选项解决它 - it embeds a search path 将库放入可执行文件中。
只需重建您的应用程序并将其添加到您的 LDFLAGS,例如 LDFLAGS="-rpath=/home/mypath/to/libevent"
(但请注意,它是一个链接器选项,并且有可能在 makefile 中作为链接器使用gcc 本身——gcc 不知道这个选项,那么你需要像 LDFLAGS="-Wl,-rpath=/home/mypath/to/libevent"
这样写来强制 gcc 将选项传递给实际的链接器)
顺便说一下,实际上您可以更改 rpath,甚至无需重新编译应用程序 — there's a tool patchelf 完成该工作。