【问题标题】:How to build a './configure && make && make install' software against a custom library which I also build?如何针对我也构建的自定义库构建“./configure && make && make install”软件?
【发布时间】:2015-09-06 16:36:59
【问题描述】:

我正在一个非常普通的 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

我认为针对自定义库构建意味着它也将在运行时使用?我的tmux 上的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 没有找到。

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

没有 root 访问权限 - 大学 Linux 工作站 - 坦率地说,我认为我不需要。我也不想和LD_LIBRARY_PATH 或类似的东西混在一起。可以说,LD_LIBRARY_PATH=$PATH_TO_MY_LIBEVENT/lib tmux 工作正常。但我希望它“默认”工作,定位并使用我的libevent

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

【问题讨论】:

  • 我不知道“tmux”或您的 Linux 环境的细节。但总的来说,你会 1) make clean: 删除你当前的二进制文件; 2) ./configure:让 GNU 构建为您的环境重新配置构建设置。据推测,这应该检测到libevent-2.0.22。最后,3)make && make install:从头开始重建。
  • 嗨 paulsm4,您为什么确信 ./configure(我假设没有开关?)应该检测到 libevent-2.0.22?我不希望它 - 我可以在任何地方构建库,它不像脚本从 / 或任何东西开始对其进行递归查找。但它应该确实使用它如果我告诉它使用位于PKG_CONFIG_PATH变量指示的路径的pkg-config文件,这就是我所做的。一切都很好,只是构建的二进制文件无法找到它应该是./configured 的库!

标签: linux makefile gnu ld configure


【解决方案1】:

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

【讨论】:

  • "rpath" 是 B 计划。“配置”应该自动检测库的可能性相当大。否则,“配置”可能有一个命令行选项来强制链接器选项(包括 rpath)。手动编辑生成文件应该是“最后的手段”。
  • @paulsm4 来自您的两个 cmets 我猜您已经漫不经心地阅读了这个问题。作者已经构建了一个库,然后针对该库构建了一个应用程序。在他们运行可执行文件后,他们显然收到了关于缺少库的错误。他们没有安装构建库的 root 访问权限,并且他们不想处理 LD_LIBRARY_PATH 变量,因此更改 rpath 是唯一剩下的选择。
  • @amn 如果您查看 INSTALLREADME 文件 (不确定哪个) 在 tmux 目录中,您将看到,您可以在配置构建时提供自定义 LDFLAGS,而无需编辑任何文件。此外,正如我所提到的,您可以使用 patchelf. 编辑可执行文件
  • @amn 我应该说不幸的是我从未使用过 pkg-config。但是从很少的搜索中,我发现该应用程序只是为构建时间提供了一些环境变量;它似乎没有修改 rpath,所以显然运行时链接器仍然对用于编译时的库一无所知。顺便说一句,我应该提到,要为库提供自定义路径,您宁愿在 LDFLAGS 中使用 -L 选项而不是 PKG_CONFIG_PATH。
  • 好吧,pkg-config 也会生成-L... 标志字符串,所以就好像你直接在LDFLAGS 中提供了-L,无论如何。
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
相关资源
最近更新 更多