0

我在linux上用C写了一些程序我想在许多远程计算机上运行这些程序,这些计算机安装了fedora或ubuntu

我在本地机器上用 gcc 编译了程序,但是可执行文件在远程机器上不可用。

例如:我用

gcc -o udp_server udp_server.c

在本地机器上获取可执行的二进制文件 udp_server 然后我将其复制到远程机器并在那里运行,错误是:

-bash: ./udp_server: /lib64/ld-linux-x86-64.so.2: 错误的 ELF 解释器:没有这样的文件或目录


本地机器:fedora Fedora release 16 (Verne) Kernel \r on an \m (\l) 3.6.10-2.fc16.x86_64 GNU/Linux

远程机器:Fedora release 12 (Constantine) Kernel \r on an \m (\l) 2.6.32-36.onelab.x86_64 GNU/Linux

在这些远程机器上,没有 gcc 编译器,所以我希望我可以制作一些可执行文件,以便它们可以在那些远程机器上执行

那么我应该制作什么样的可执行文件,以及如何制作它们?任何推荐工具或程序?谢谢!

4

3 回答 3

3

要运行用 C 编写的程序,您必须首先对其进行编译以生成可执行文件。在 Linux 上,C 编译器通常是“Gnu C 编译器”,或gcc.

如果您在 Linux 上编译 C 程序,它通常应该在任何其他 Linux 计算机上运行。但是,必须满足一些条件才能使其起作用:

  • 编译后的可执行文件针对特定的处理器架构进行编译。例如,如果您针对x86-x64进行编译,则该程序将无法在 x86 或 PowerPC 上运行。
  • 如果程序使用共享库,则必须在目标系统上安装这些库。C 库“libc”随处安装,其他库可能没有。

至于如何编译:对于一个简单的程序,可以gcc直接调用。对于更复杂的程序,建议使用一些构建工具。有很多可供选择;两个流行的选择是 GNU make(传统解决方案)和CMake

分发程序:如果它只是一个可执行文件,你可以复制这个可执行文件。如果程序由多个文件(图像、数据文件等)组成,则应将其打包为软件包。这允许用户使用包管理器(例如 RPM 或 dpkg)安装它。不同 Linux 发行版的各种打包指南中解释了如何做到这一点。

最后,一条建议:您似乎对软件开发,尤其是 C 语言知之甚少考虑阅读一些关于 C 语言编程的教程——这将回答这些(以及许多其他)问题。有无数的书籍和在线教程——我可以推荐gbdirect的“The C book”

于 2013-03-08T12:50:32.520 回答
2

您看到的问题是您在目标机器上缺少动态库。要查看您需要哪些库,您需要使用“ldd”程序。示例(我只是针对每个 Linux 发行版中的标准程序“test”执行它):

$ ldd /usr/bin/test
    linux-vdso.so.1 =>  (0x00007fff5fdfe000)
    libc.so.6 => /lib64/libc.so.6 (0x00000032d0600000)
    /lib64/ld-linux-x86-64.so.2 (0x00000032cfe00000)

在 Fedora 和 RHEL 上,您可以使用以下命令找到要安装的 RPM 包

$ rpm -q --whatprovides /lib64/ld-linux-x86-64.so.2
glibc-2.16-28.fc18.x86_64

然后你需要安装它:

$ yum -y install glibc-2.16-28.fc18.x86_64

我不使用 Ubuntu / Debian,不知道该怎么做。请注意,在 32 位系统上 64 位的库不可用,但在 64 位系统上,这些库具有通常的 i686 标签并且可以安装。

于 2013-03-08T17:47:43.410 回答
0

通常,只要您保持架构,您就可以在不同的机器上执行您的程序。例如,您不能在 32 位机器上执行 64 位程序,反之亦然(您可以通过安装 32 位库来解决此问题,但这可能太难了)。

如果你有不同的发行版,或者同一个 linux 发行版的不同版本,这可能是个问题——你需要确保所有依赖项都在同一个主要版本中。

或者您可以静态链接库,这在 linux 世界中根本不常见,但您可以这样做。学习如何使用 GCC,然后你就会知道如何去做。

于 2013-03-08T12:52:33.420 回答