如何根据源代码制作可执行文件
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 位开始。以上是关于如何根据源代码制作可执行文件的主要内容,如果未能解决你的问题,请参考以下文章
如何反编译旧Macromedia Director 7制作的可执行文件?