【问题标题】:How can I compile a Linux executable for a different machine?如何为不同的机器编译 Linux 可执行文件?
【发布时间】:2013-10-28 14:48:17
【问题描述】:

我用 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)

(其中&lt;program&gt; 是我的程序名称。)

据我所知,我的程序只需要那个版本的 GLIBC,因为 libdbi 需要。我已尝试从源代码编译 libdbi,但它仍会尝试链接到该版本的 GLIBC。

我不拥有服务器系统(它是我运行网站的共享系统,并且可以通过 SSH 访问),所以我无法对其进行任何更改——这就是库文件在同一个文件中的原因目录,我设置了LD_LIBRARY_PATH=.。不幸的是,我也无法访问它上面的编译器——当我尝试运行 GCC 时,我被告知“权限被拒绝”。它由一家大公司经营,而我只是一个客户;他们应我的要求进行任何更改的机会基本上为零。

有什么方法可以在我的系统上编译程序,以便它可以在服务器上运行?

在我问之前,我发现了这些类似的问题:

还有其他的,但它们似乎是这些的变体。

如果我把它变成商业产品,我愿意使用非免费的解决方案(就像我在另一个我现在找不到的答案中看到的那样),但对于单次使用来说,它似乎是巨大的矫枉过正,更不用说费用了。

有什么方法可以简单地告诉 libdbi 链接到更高版本的 GLIBC 吗?如果没有,有没有我忽略的解决方案?

【问题讨论】:

    标签: c linux gcc


    【解决方案1】:

    无论是否是大公司,如果您以任何方式为服务付费或为满足要求而为开发付费,那么他们欠您的至少是对运行时环境的仔细描述,以便您可以在开发机器上复制它。

    那么你必须着手系统地复制这个环境。由于您使用的是libdbi,因此您应该彻底。数据库连接可以使用系统 API 的很大一部分,因此您希望拥有完全相同的 Linux 版本 gcc(即使您无法运行它,您也需要知道系统其他部分编译时使用的版本),和其他工具和库。如果不这样做,您将无法确信您的开发机器测试会转化为目标上的良好行为。

    虚拟机是创建专用开发环境而又不会破坏现有环境的好方法。

    【讨论】:

    • 谢谢。结果他们使用的是 CentOS6,它显然只提供 GLIBC 2.x 到 2.12 的版本——我没有意识到 libc 的向后兼容性被这样破坏了。 :-( 无论如何,我正在获取该操作系统的安装 DVD 映像,我将为它创建一个 VM 并尝试在那里编译它。
    【解决方案2】:

    您必须在与目标机器具有相同 glibc 版本或旧版本的机器上编译它。共享库兼容性仅在该方向上起作用。

    【讨论】:

      【解决方案3】:

      找出服务器使用的 Linux 版本,获取它的副本并将其安装在 VM 中

      Virtualbox 很适合这个

      您可以使用这个环境来测试代码以及​​这个特定的编译问题

      【讨论】:

        【解决方案4】:

        您有以下选择:

        • 在服务器机器上编译你的代码(可能安装了 gcc)
        • 使用静态链接库编译您的程序(选项 -static 用于 gcc)

        【讨论】:

        • 谢谢,但这些选项都不可用。 libdbi 不能静态编译,我没有权限在服务器上使用 GCC。有关这两个方面的详细信息,请参阅原始问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2019-02-14
        • 1970-01-01
        • 1970-01-01
        • 2019-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多