【问题标题】:linux binary independent of shared librarieslinux 二进制独立于共享库
【发布时间】:2011-01-27 19:09:56
【问题描述】:

我有一个 C++ 程序,它依赖于很多库(一些常见的系统库,如 libjpeg,一些未在系统范围内安装的个人库)。该程序在机器 A (Debian Squeeze) 上编译良好。我想在机器 B(Ubuntu maveric)和机器 C(Arch)上运行程序。假设两台机器 B+C 都是极少的安装。不要指望在那里找到我的程序使用的任何库,如果有的话,它们的版本不同。

是否有任何程序可以扫描我的程序的所有依赖项(使用 ldd 或其他东西)收集所有这些依赖项,并生成一个脚本来告诉二进制文件使用这些以及它在任何其他系统上附带的这些库?

谢谢!

【问题讨论】:

  • 祝你好运;或者,您可以按照惯例提供源代码
  • 我不打算“交付”。我想要这个供我自己使用。我有源代码,但重新编译可能真的很痛苦。例如,编译器通常假设使用不同版本的库是安全的。然而,情况并非总是如此 - 我想 100% 确定程序在每台机器上使用完全相同的库。
  • 听起来你做得不对。从源代码构建应该很容易。如果我是你,我会专注于解决这个问题。
  • @David Heffernan 听起来您正在使用比我更智能的构建系统。关心分享? (请记住,我不想为每个系统编写特定的 Makefile、Cmake findscripts 或其他任何东西)
  • klik 曾经能够从 Debian 软件包和依赖项中自动创建配方,但它有一段时间没有更新,并且 .deb 格式在那个时候已经更新了一些,所以我不确定它是否仍然有效。

标签: c++ linux binary portability ldd


【解决方案1】:

我不是 100% 确定我理解您的问题,但您似乎希望将库与您的包一起提供,并使用 LD_LIBRARY_PATH 强制链接器先查看您提供的库目录。

如果还有更多内容,我可以修改我的答案,因为我对此有一些经验。只是想确保我知道您的要求。

【讨论】:

  • 听起来不错。那会行吗?编译器(在我的情况下为 gcc)是否总是在 LD_LIBRARY_PATH 中使用库,例如​​ /usr/lib 中的库?如果是这样的话:是否有任何程序可以自动解析 ldd -v 的输出(这应该让我获得所有依赖项对吗?)并将所有库复制到一个目录中?
  • +1 到 LD_LIBRARY_PATH 解决方案。另一种选择是对所有依赖库进行静态构建,并将它们全部链接到一个单一的二进制文件中。
  • 乔克,没错。顺序是 rpaths(嵌入到请求它的可执行文件中的 lib 目录)、LD_LIBRARY_PATH,然后是 /etc/ld.so.conf 中的默认路径。查看linux.die.net/man/8/ld-linux了解更多详情。
【解决方案2】:

事实证明,您的问题的答案是静态链接,例如使用 g++ -static。

【讨论】:

  • +1,前提是您将静态构建隔离到发布模式,并且在调试/开发模式下不存在。
  • 我在调试和发布之间的唯一区别是-strip。
  • 那么我会说,如果您包含标准库以外的任何内容,那么这很愚蠢,因为构建时间需要更长的时间。
  • 我有足够的磁盘缓存和 cpu 能力,我不必关心。
  • 我觉得我有点太习惯需要构建二进制文件并将其传输到嵌入式臂板上了。
猜你喜欢
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多