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

Posted

技术标签:

【中文标题】如何根据源代码制作可执行文件【英文标题】:how to make excutable files based on source codes 【发布时间】:2013-02-24 00:16:21 【问题描述】:

我在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 16 版(凡尔纳) \m (\l) 上的内核 \r 3.6.10-2.fc16.x86_64 GNU/Linux

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

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

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

【问题讨论】:

“”,即compilation。你不是在问如何编译你的源代码,你在问为什么分发的可执行文件不能在另一台机器上运行。 这里讨论了您收到的错误消息:CentOS 64 bit bad ELF interpreter 您需要使用交叉编译器为不同的机器创建可执行文件。 【参考方案1】:

您看到的问题是您在目标机器上缺少动态库。要查看您需要哪些库,您需要使用“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】:

要运行用 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 语言编程的教程——这将回答这些(以及许多其他)问题。有无数的书籍和在线教程 - 我可以推荐"The C book",作者是 gbdirect。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

不完全正确。 x86-64 (amd64) 支持向后兼容 x86-32 (IA32) source 我上面说了,再读一遍。但是你需要额外的 32 位库,我试图警告这个人,因为他似乎是这个领域的初学者...... 如果可执行文件依赖于 32 位库,那么可以。如果没有,您不需要安装任何东西。无论如何,这是一个小问题:) 我还是没明白,如果我的机器是x86-64,而远程机器只是x86,如何制作可执行文件以便在远程机器上执行? 确实如此。用户:嗯,你不能正常这样做,但另一个方向会起作用。有一种叫做交叉编译的解决方案,但我宁愿建议你先从 64 位开始。

以上是关于如何根据源代码制作可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

如何制作exe程序可执行文件

如何制作exe程序可执行文件

如何制作exe程序可执行文件

如何反编译旧Macromedia Director 7制作的可执行文件?

使用 Java 在 Selenium WebDriver 中制作可执行文件

如何通过连接到 sqlite3 数据库来制作可执行的 python tkinter 文件