Glibc版本不匹配

时间:2016-02-01 15:00:01

标签: c++ linux gcc

我在我的Ubuntu中创建了.so库并在另一台机器上运行它。得到错误:

/lib/tls/i686/cmov/libc.so.6: version `GLIBC_2.15' not found

我想这是一般的C ++库。但是如何解决这样的问题呢?我无法更改客户端配置,这意味着我必须对我的配置执行某些操作。但究竟我必须做什么?

UPD

ldd -version返回

我的机器:

ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19

主机:

ldd (Ubuntu EGLIBC 2.11.1-0ubuntu7.8) 2.11.1

4 个答案:

答案 0 :(得分:2)

在目标计算机上,运行 ldd --version 并检查输出,它将告诉您它们具有哪个版本的GLIBC_。

  1. 然后您可以回滚以匹配他们的版本。
  2. 静态链接您的可执行文件,因此它不需要他们的Clib。
  3. 一旦你知道它是什么,你也可以改变你的程序以使用旧版本。
  4. 请参阅此SO解决方案以了解如何执行此操作。 How can I link to a specific glibc version?

答案 1 :(得分:1)

您必须确保链接到相应或较旧版本的GLIBC。 GCC具有标志{{1}},允许您定义使用哪些库。

这可能对细节有所帮助:https://sourceware.org/glibc/wiki/Testing/Builds

答案 2 :(得分:0)

重点是创建共享库必然意味着您需要将其链接到C库(在您的情况下为glibc)。这意味着对C库函数(stdc ++库所做的)的调用将被替换为C库中的实际正确的符号位置。

现在,如果编译/链接机器上的C库与目标机器上的C库不同,则此必须失败,因此会检查libc版本。

解决方案是静态链接你的.so(通常没有多大意义),或者只是为你的目标机器正确编译和链接它。

答案 3 :(得分:0)

除了编译一切静态,这通常是一个坏的 想法或根本不工作,解决问题的唯一方法 是为目标平台重新编译二进制文件。

使用相同的Ubuntu版本安装虚拟机或chroot 在目标平台上并在那里编译。还有解决方案 像sbuildpbuilder/cowbuilder这样可以为Debian / Ubuntu软件包自动执行此操作。