我用C编写了一个Linux程序,我试图让它在服务器系统上运行。看起来一切都应该有效,但是当我尝试它时,我明白了:
/lib64/libc.so.6: version `GLIBC_2.14' not found (required by <program>)
/lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./libdbi.so.1)
(<program>
是我程序的名称。)
据我所知,我的程序只需要GLIBC版本,因为libdbi会这样做。我尝试从源代码编译libdbi,它仍然试图链接到该版本的GLIBC。
我不拥有服务器系统(它是我运行网站的共享系统,并且具有SSH访问权限),因此我无法对其进行任何更改 - 这就是库文件相同的原因目录,我设置了LD_LIBRARY_PATH=.
。不幸的是我也没有访问它的编译器 - 当我尝试运行GCC时,我被告知“许可被拒绝”。它由一家大公司经营,我只是一个客户;他们根据我的要求做出任何改变的机会基本上都是零。
有没有办法在我的系统上编译程序,以便它可以在服务器上运行?
在我问之前,我发现了类似的问题:
Compile C program in Linux with different glibc library:答案中的链接转到404页面,根据我能够确定的内容,apgcc
在Debian发行版中不可用。
Relink a shared library to a different version of libc:似乎说这个问题不存在,因为“glibc倾向于向后兼容”(除非他们显然不是这种情况)。
How to compile Linux C program to run on another Linux machine?:建议使用chroot
或虚拟机,我在其他地方之前已经完成了,但是如何在不使用旧版GLIBC的情况下使用libc?
is binary executable file portable:建议使用静态链接,但libdbi
动态链接到其驱动程序文件,因此显然无法完成 - 我收到几个错误,指的是丢失的函数,如ldopen
。
还有其他人,但他们似乎是变体。
我愿意使用非免费的解决方案(就像我在另一个我现在找不到的答案中看到的那样)如果我把它变成商业产品,但是对于一次性使用它似乎是大规模的过度杀伤力,更不用说费用了。
有没有办法简单地告诉libdbi链接到以后的GLIBC版本,也许?如果没有,有没有我忽视的解决方案?
答案 0 :(得分:2)
您必须在与目标计算机具有相同版本的glibc或旧版本的计算机上进行编译。共享库兼容性仅适用于该方向。
答案 1 :(得分:1)
大公司与否,如果您以任何方式为服务付费或为满足要求而进行开发支付,则他们欠您的最少是对运行时环境的仔细描述,以便您可以在开发机器上复制它。
然后你必须开始系统地复制这个环境。由于您使用libdbi
,因此您应该彻底。数据库连接可以运行大块的系统API,所以你想要拥有完全相同的Linux版本,gcc(即使你不能运行它,你需要知道系统的其他部分的编译版本),和其他工具和库。如果不这样做,您将无法对开发机器测试转化为目标上的良好行为充满信心。
虚拟机是创建专用开发环境而不会弄乱现有开发环境的好方法。
答案 2 :(得分:1)
找出服务器使用的Linux版本,获取它的副本并将其安装在VM中
Virtualbox适用于此
您可以使用此环境来测试代码以及此特定编译问题
答案 3 :(得分:0)
您有以下选择: