我怎样才能弄清楚为什么某个特定版本的库存在于依赖项中?

时间:2012-07-26 07:07:41

标签: c++ linux ubuntu glibc libc

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

如果不确切知道你正在构建什么,我会说你可能会更好地建立在11.04上,然后在12.04上运行。