2015-09-27 138 views
0

我写了一个C程序,并使用someProgram.c保存并编译到我的64位机器上。生成了“someProgram.out”文件。我将someProgram.out发送给朋友,但没有在他的机器上执行。它报告“无法执行二进制文件”错误,当他试图在他的虚拟机中安装的Ubuntu 14.04上运行它。 如何编写代码,以便它可以在不同体系结构的计算机上运行,​​也可以在虚拟机上运行,​​而无需在所有计算机上编译,即仅在我的计算机上编译后才能运行?如何在不编译它的情况下在不同的体系结构上编译相同的C代码?

+0

如果您使用交叉编译器,您可以编译您的程序用于不同的目标,但仍需要为每个目标编译它。 – melak47

+0

您必须为体系结构或C解释器使用仿真器,该解释器也涵盖使用的库函数。 – Olaf

+1

编译32位并安装i386软件包。 http://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit –

回答

2

“无法执行二进制文件”可能由许多不同的事情引起。如果体系结构真的不同,那么除了重新编译它(除了运行原始的操作系统和处理器体系结构的模拟器,但这是)或者将代码重写为某种编译中间形式(例如,可以编译为Java字节码的Java本身可通过具有执行代码的“Java虚拟机”进行移植。另一方面,如果问题在于二进制文件缺少一些依赖项 - 一些共享库位于您的机器上,但不在您的朋友的机器上,那么解决方案是安装相应的库(右侧版)。或者使用静态库重新编译,以便它不依赖于共享库。

编译C +或C++代码的目的是生成一个可在特定OS /处理器架构上直接执行的二进制文件。 C和C++语言只能作为源代码而不是二进制可执行文件移植到其他操作系统/处理器软件包中。

0

想象一下,你正在做一个100块拼图游戏,你失去了一块。所以你从一个不同的难题中偷了一块,所以你会有100件。

问题是,新作品不是为你的拼图而制作的。它不适合。如果你已经从与你的完全相同的难题中获得了你的第100张作品,它会奏效。 (“它在我的机器上运行”)

编译器为您的目标操作系统生成代码。如果你是64位,那么你的编译器可能会默认创建一个64位的拼图。如果你的朋友正在运行32位,那么你的64位拼图片将不适合他的拼图。

告诉您的编译器为目标生成正确的代码。

这个计算器的问题可能会帮助你走上正确的道路。如果没有,如果写得好改变代码,,您可以更改编译器标志可以产生两个不同的目标图像(拼图)

How do I create a single makefile for both 32- and 64-bit?

你的编译器可能会尖叫各类取决于你如何写警告你程序不依赖于OS中的位数。

如果你正在做跨平台,那么你将需要了解其他标志。这是你学习的地方。

相关问题