Linux 如何根据源代码生成可执行文件

Linux 如何根据源代码生成可执行文件,linux,ubuntu,compilation,fedora,rpm,Linux,Ubuntu,Compilation,Fedora,Rpm,我用C在linux上写了一些程序 我想在许多安装了fedora或ubuntu的远程计算机上运行这些程序 我在本地机器上用gcc编译了这个程序,但是可执行文件在远程机器上不可用 例如:我使用 gcc -o udp_server udp_server.c 在本地计算机上获取可执行二进制文件udp_服务器,然后将其复制到远程计算机并在那里运行,错误为: -bash:./udp_server:/lib64/ld-linux-x86-64.so.2:错误的ELF解释器:没有这样的文件或目录 本地机器:

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

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

例如:我使用

gcc -o udp_server udp_server.c
在本地计算机上获取可执行二进制文件udp_服务器,然后将其复制到远程计算机并在那里运行,错误为:

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


本地机器:fedora 软呢帽发布16(凡尔纳) 内核\r位于\m(\l)上 3.6.10-2.fc16.x86_64 GNU/Linux

远程计算机: 软呢帽发行版12(君士坦丁) 内核\r位于\m(\l)上 2.6.32-36.onelab.x86_64 GNU/Linux

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

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

要运行用C编写的程序,必须先将其生成一个可执行文件。在Linux上,C编译器通常是“GNUC编译器”,或
gcc

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

  • 编译的可执行文件针对特定的处理器体系结构进行编译。例如,如果为编译,程序将不会在x86或PowerPC上运行
  • 如果程序使用共享库,则必须在目标系统上安装这些库。C库“libc”安装在任何地方,其他库可能不安装
至于如何编译:对于一个简单的程序,您可以直接调用
gcc
。对于更复杂的程序,建议使用一些构建工具。有很多选择;两种流行的选择是GNU
make
(传统解决方案)和

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


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

要运行用C编写的程序,必须首先生成一个可执行文件。在Linux上,C编译器通常是“GNUC编译器”,或
gcc

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

  • 编译的可执行文件针对特定的处理器体系结构进行编译。例如,如果为编译,程序将不会在x86或PowerPC上运行
  • 如果程序使用共享库,则必须在目标系统上安装这些库。C库“libc”安装在任何地方,其他库可能不安装
至于如何编译:对于一个简单的程序,您可以直接调用
gcc
。对于更复杂的程序,建议使用一些构建工具。有很多选择;两种流行的选择是GNU
make
(传统解决方案)和

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


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

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

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


或者您可以静态链接库,这在linux世界中根本不常见,但您可以这样做。学习如何使用GCC,然后您将了解如何做到这一点。

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

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


或者您可以静态链接库,这在linux世界中根本不常见,但您可以这样做。了解如何使用GCC,然后您将了解如何使用。

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

在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
我不喜欢我们
$ yum -y install glibc-2.16-28.fc18.x86_64