首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何基于源代码生成可执行文件

如何基于源代码生成可执行文件
EN

Stack Overflow用户
提问于 2013-03-08 12:41:43
回答 3查看 357关注 0票数 0

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

我和gcc一起在本地机器上编译了程序,但是这个可执行的文件在远程机器上是行不通的。

例如:我使用

代码语言:javascript
复制
gcc -o udp_server udp_server.c

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

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

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-08 12:50:32

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

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

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

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-03-08 17:47:43

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

代码语言:javascript
复制
$ 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包

代码语言:javascript
复制
$ rpm -q --whatprovides /lib64/ld-linux-x86-64.so.2
glibc-2.16-28.fc18.x86_64

然后你需要安装它:

代码语言:javascript
复制
$ yum -y install glibc-2.16-28.fc18.x86_64

我不使用Ubuntu / Debian,不知道如何做到这一点。请注意,在32位系统上,64位的库是不可缺少的,但是在64位系统上,这些库通常有一个i686标记,并且是可安装的。

票数 2
EN

Stack Overflow用户

发布于 2013-03-08 12:52:33

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15294230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档