我用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发布12(康斯坦丁) \ m(\ l)上的内核\ r \ n 2.6.32-36.onelab.x86_64 GNU / Linux
在这些远程机器上,没有gcc编译器 所以我希望我可以制作一些可删除的文件,以便它们可以在那些远程机器上执行
那么我应该制作什么类型的可删除文件,以及如何制作它们? 任何推荐工具或程序? 谢谢!
答案 0 :(得分:3)
要运行用C编写的程序,必须先compile才能生成可执行文件。在Linux上,C编译器通常是“Gnu C编译器”或gcc
。
如果在Linux上编译C程序,它通常应该在任何其他Linux计算机上运行。但是,必须满足一些条件才能实现:
关于如何编译:对于一个简单的程序,您可以直接调用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,然后你会发现如何做到这一点。