运行此处编译的C程序会导致另一台服务器上找不到GLIBC库错误 - 这是我的错还是他们的?

Dou*_*ner 5 linux ubuntu glibc

这里编译的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)
Run Code Online (Sandbox Code Playgroud)

我是否需要升级我们的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
Run Code Online (Sandbox Code Playgroud)

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

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

是否只是我升级C库包并重新编译你认为?或者是另一个人的服务器缺少一些所需的库以实现兼容性?

Emp*_*ian 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; }
Run Code Online (Sandbox Code Playgroud)

然后你的程序将运行没有任何错误.

更新2:

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

不,他们没有.该GLIBC_2.11会在它以前所有的符号.事实上,他们无法安装两个的glibc-2.4和2.7,即使他们想:这是相当困难的安装在同一时间多个版本,而不可能有安装在默认位置的多个版本.