如何构建'./configure&&制造&& make build'软件针对我也建立的自定义库?

时间:2015-06-20 22:18:45

标签: linux makefile gnu ld configure

我正在一个非常普通的Linux主机上从源代码构建tmux-2.0。第一次尝试失败,因为事实证明安装的libevent版本早于所需版本,因此我首先从源代码(编写本文时的当前版本)下载并构建libevent-2.0.22

libevent的构建完美无缺,我想我可以使用以下内容重新构建tmux

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

上述调用成功,后续makemake 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

我是否需要设置,我不知道,LIBSLDFLAGS或其他一些变量或切换到上面的configure脚本,所以,我不知道知道,新建libevent的路径嵌入tmux二进制文件中,由ld提供?

没有 root访问权限 - 大学Linux工作站 - 坦白说我不需要一个,我想。我也不想与LD_LIBRARY_PATH之类的东西混在一起。可以说,做LD_LIBRARY_PATH=$PATH_TO_MY_LIBEVENT/lib tmux的工作正常。但我希望它“默认”工作,找到并使用我的libevent

我想这个解决方案几乎适用于任何使用“GNU构建系统”的软件。在这做什么是正确的?

1 个答案:

答案 0 :(得分:3)

您是针对库构建的,但系统并不知道库的位置。由于您不想安装库,而是将其保留在构建它的位置,因此您可以使用链接器的-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也可以。