Linux 如何构建'/配置&&;制造及保养&;进行安装';针对我也构建的自定义库的软件?

Linux 如何构建'/配置&&;制造及保养&;进行安装';针对我也构建的自定义库的软件?,linux,makefile,gnu,ld,configure,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 ... 上述调用成功,后续的make和makeinstall也成功 但是,运行

我正在一台相当普通的Linux主机上从源代码构建
tmux-2.0
。第一次尝试失败,因为安装的
libevent
版本比要求的版本旧,所以我首先从源代码(撰写本文时的当前版本)下载并构建
libevent-2.0.22

构建
libevent
成功无误,我想我可以用以下方法重试构建
tmux

PKG_CONFIG_PATH=$PATH_TO_MY_BUILT_LIBEVENT/lib/pkgconfig ./configure ...
上述调用成功,后续的
make
makeinstall
也成功

但是,运行我的新构建
tmux
,会中止一个缺少的共享对象,这并不奇怪
libevent-2.0。因此.5

tmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
我认为根据自定义库构建意味着它也将在运行时使用<我的
tmux上的code>ldd
提供了:

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
提供

我没有根访问权限——大学Linux工作站——坦率地说,我想我不需要根访问权限。我也不想乱搞
LD\u LIBRARY\u PATH
之类的东西。只需说,执行
LD_LIBRARY_PATH=$PATH_to_MY_LIBEVENT/lib tmux
就可以了。但我希望它“默认”工作,定位并使用我的
libevent


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

您是针对库构建的,但系统不知道库在哪里。由于您不想安装库,而是将它留在构建库的地方,因此可以使用链接器的
-rpath=
选项将库解析到可执行文件中

只需将应用程序添加到LDFLAGS中,然后重新构建应用程序,如
LDFLAGS=“-rpath=/home/mypath/to/libevent”
(但请注意,它是一个链接器选项,可能在makefile中作为链接器使用gcc本身-gcc不知道该选项,然后需要像
LDFLAGS那样编写它=“-Wl,-rpath=/home/mypath/to/libevent”
强制gcc将选项传递给实际的链接器)


顺便说一句,实际上,您甚至可以在不重新编译应用程序的情况下更改rpath—对于该作业。

我不知道“tmux”和“tmux”的具体细节“或您的Linux环境。但一般来说,您需要1)
makeclean
:删除当前的二进制文件;2)
/configure
:让GNU build为您的环境重新配置生成设置。据推测,这应该检测到
libevent-2.0.22
。最后,3)
make&&make install
:从头开始重建。嗨,paulsm4,为什么您确信
/configure
(我假设没有开关?)应该检测
libevent-2.0.22
?我不期望它会这样-我可以在任何地方构建库,它不像脚本从
/
或任何东西开始对它进行递归查找。但如果我告诉它使用驻留在
pkg\u config\u path
变量指示的路径上的
pkg config
文件,它确实应该使用它,这就是我所做的。一切都构建得很好,只是构建的二进制文件找不到它应该使用的库
/configure
d!“rpath”是计划B。很可能“configure”会自动检测库。否则,“configure”可能有一个命令行选项来强制链接器选项(包括rpath)。手动编辑makefile应该是“最后的手段”。@paulsm4从您的评论中,我猜您是无意中阅读了这个问题。作者已经构建了一个库,接下来是一个针对该库的应用程序。在他们运行可执行文件之后,他们显然得到了一个关于丢失库的错误。他们没有根访问权限来安装生成的库,他们不想处理
LD_library\u PATH
变量,因此更改rpath是唯一剩下的选项。@amn您不需要触摸makefile,如果查看tmux目录中的安装或自述文件(不确定是哪一个),您将看到,您可以在配置生成时提供自定义LDFLAGS,而无需编辑任何文件。此外,正如我提到的,您可以用patchelf编辑可执行文件。@amn我应该说,不幸的是,我从未使用过pkg config。但通过少量搜索,我发现该应用程序只是为构建时间提供了一些环境变量;它似乎没有修改rpath,所以显然运行时链接器仍然不知道编译时使用的lib。作为旁注,我应该提到,要提供库的自定义路径,您最好在LDFLAGS中使用
-L
选项,而不是PKG_CONFIG_path.Well,
PKG CONFIG
也会生成
-L..
标志字符串,因此,无论如何,这与您在
LDFLAGS
中直接提供的
-L
完全相同。