如何根据源代码制作可执行文件

时间:2013-03-08 12:41:43

标签: linux ubuntu compilation fedora rpm

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

我在本地计算机上使用gcc编译了程序,但是可删除文件在远程计算机上不可用。

例如:我使用

gcc -o udp_server udp_server.c

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

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


本地机器:fedora Fedora发布16(凡尔纳) \ m(\ l)上的内核\ r \ n 3.6.10-2.fc16.x86_64 GNU / Linux

远程机器: Fedora发布12(康斯坦丁) \ m(\ l)上的内核\ r \ n 2.6.32-36.onelab.x86_64 GNU / Linux

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

分发程序:如果它只是一个可执行文件,你可以只复制这个可执行文件。如果程序包含多个文件(图像,数据文件等),则应将其打包为软件包。这允许用户使用package manager(例如RPM或dpkg)安装它。有关如何执行此操作的说明,请参阅各种Linux发行版的各种打包指南。

最后,提出一条建议:您似乎很少知道非常关于软件开发,尤其是C语言。考虑在C中阅读一些关于programmin的教程 - 这将回答这些(以及许多其他)问题。有无数的书籍和在线教程 - 我可以通过gbdirect推荐"The C book"

答案 1 :(得分: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标签并且可以安装。

答案 2 :(得分:0)

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

如果您有不同的发行版或相同Linux发行版的不同版本,这可能会出现问题 - 您需要确保所有依赖项都在相同的主要版本中。

或者你可以静态链接库,这在linux世界中是不常见的,但你可以这样做。学习如何使用GCC,然后你会发现如何做到这一点。