【问题标题】:How can I work out why a specific version of a library is in the dependencies?我怎样才能弄清楚为什么特定版本的库在依赖项中?
【发布时间】:2012-07-24 17:40:49
【问题描述】:

我正在 ubuntu 12.04 上使用 cmake 构建一个大型 C++ 项目,然后获取生成的二进制包并尝试在 ubuntu 11.04 上运行它。然而,该程序未能说它需要 glibc 2.14 版,但只能找到 2.13 版。 我怎样才能确切地知道为什么需要 glibc=>2.14?

【问题讨论】:

    标签: c++ linux ubuntu glibc libc


    【解决方案1】:

    与大多数库不同,glibc 对其符号进行版本化。每个符号都标有一个值(例如“GLIBC_2.3.4”),表示上次更改其接口的库版本。这允许库包含给定符号的多个版本,并支持针对旧版本编译的二进制文件,同时保留进化的能力。您可以通过objdump -T /lib/libc.so.6查看此详细信息。

    基本上,您应用中的某些内容与自 11.04 以来更改的符号相关联。在你的二进制文件上尝试objdump -T,看看它在寻找什么标签。

    但从广义上讲,向后兼容性在 Linux 中并不像那样工作。如果你想在旧软件上运行某些东西,你应该在旧软件上构建它。可以在更新的发行版上设置向后兼容的工具链,但这不是默认设置。

    【讨论】:

    • 向前兼容更容易吗?就像我在 10.04 上构建的那样,二进制文件可能会在 12.04 上运行(主要考虑 glibc 并忽略像 ffmpeg 这样可怕的东西)
    • 令人困惑的是,这个程序在 11.04 上构建和运行良好,只是在 12.04 上构建的二进制文件在 11.04 上无法运行。
    • 好的,我发现依赖于 memcpy()。似乎这个函数在 glibc 2.14 中被改变了。考虑到我们确实在 11.04 等版本上构建和运行了这个应用程序,而且我们对旧版本的 memcpy() 感到满意,你认为什么是好的行动方案?
    • 是的,10.x 版本应该在 12.x 上开箱即用。
    • 完全正确:glibc 级别的前向兼容性是 100% 保证的。除非这是一个严重的困难(即针对一个真正旧发行版),否则最简单的事情就是在 10.04 Lucid 上构建,这是一个仍在支持的 LTS。如果您绝对必须在 12.04 上构建,您可以从旧资源构建自己的 glibc 并链接。
    【解决方案2】:

    当您构建您的 C++ 项目时,它将链接到您安装的 12.04 上的 glibc 库版本。您的构建命令中有哪些链接器选项?

    如果不确切知道您正在构建什么,我会说您最好在 11.04 上构建然后在 12.04 上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2023-04-01
      • 2014-04-09
      • 2021-11-29
      • 1970-01-01
      相关资源
      最近更新 更多