5

此处编译的 AC 程序在我们的 Ubuntu 服务器上运行良好。但是当其他人试图在他们的特定 Linux 服务器上运行它时,他们会收到以下错误:

./myprog-install: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by ./myprog-install)
./myprog-install: /lib/tls/libc.so.6: version `GLIBC_2.7' not found (required by ./myprog-install)

我需要升级我们的 glibc 库并重新编译吗?或者他们在他们的服务器上遗漏了什么?

如果我运行 apt-cache show libc6 我的 Ubuntu 会告诉我版本是:

Package: libc6
Priority: required
Section: libs
Installed-Size: 9368
Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: i386
Source: eglibc
Version: 2.11.1-0ubuntu7.10

如果我查看http://packages.ubuntu.com/hardy/libc6,当前版本似乎是 2.7-10ubuntu8.1。

我对数字感到困惑。一方面,2.11-1-0 比 2.7-11 高。另一方面,7.10 比 8.1 低。

你认为这只是我升级 C 库包并重新编译的问题吗?或者其他人的服务器是否缺少一些需要的库以实现兼容性?

4

3 回答 3

8

你已经建立在 glibc-2.11 系统上。您正在尝试在具有 glibc-2.3 或更早版本的系统上运行。那是行不通的。

是否只是我升级 C 库包的问题

不:升级你的 glibc 只会让事情变得更糟

您可能想尝试此处列出的解决方案。

这是我们可以合理地要求对方升级他们的系统来支持的东西,而不是降级我们的编译器吗?

通常客户端会强烈拒绝升级他们的系统的请求:它对他们来说工作正常任何升级都可能破坏其他现有的应用程序。

如果您打算在 Linux 上分发二进制文件(而不是在目标系统上构建它们),那么您需要学习如何制作可以在任何地方运行的二进制文件,或者您需要说明您的要求(最低内核和 libc 版本等) .) 并将无法满足这些要求的客户拒之门外。

更新:

为什么他们得到两个错误。为什么他们不只为 GLIBC_2.11.1 买一个,这显然是我构建的?

符号版本控制不是这样工作的。

当引入一个新符号时,它会被标记为当前的libc 版本,例如readdir64@@GLIBC_2.2,posix_spawn@@GLIBC_2.15等。

当您链接使用上述两种符号的程序并尝试在例如 glibc-2.1 系统上运行它时,您会得到两个错误。

但是,如果您链​​接的程序使用上述任何符号,例如

int main() { return 0; }

那么您的程序将正常运行而不会出现任何错误。

更新 2:

他们不必将 GLIBC_2.4 和 GLIBC2.7 都添加到他们的 Linux 系统中,是吗?

不,他们没有。将GLIBC_2.11包含所有以前的符号。事实上,即使他们想安装 glibc-2.4 和 2.7,他们也无法同时安装:同时安装多个版本非常困难,并且不可能在默认位置安装多个版本。

于 2012-05-15T05:18:46.827 回答
1

您已经针对太新的 glibc 版本构建了它。针对旧版本的 glibc 构建它,最好是他们正在使用的那个。

于 2012-05-15T05:13:59.290 回答
0

您需要在使用与您相同的库版本的系统上进行构建。这是 docker 和 VM 非常方便的地方。客户拥有的任何版本都可能有一个预制的 docker 映像。

于 2021-11-25T21:31:50.357 回答