如何使相同的编译C代码在不同的架构上工作,而无需再次编译?

时间:2015-09-27 15:43:18

标签: c computer-architecture

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

2 个答案:

答案 0 :(得分:3)

"无法执行二进制文件"可能是由许多不同的事情引起的。如果体系结构真的不同,那么除了重新编译它之外你没有希望(除了运行原始操作系统和处理器体系结构的模拟器,但是那个)或者将代码重写为某些编译中间形式,例如可以编译为Java字节码的Java,它本身可以通过具有" Java虚拟机"执行代码。

另一方面,如果问题是二进制文件缺少某些依赖项 - 某些共享库位于您的计算机上,而不是您朋友的计算机上,则解决方案是安装相关库(正确的版本)。或者使用静态库重新编译,以便它不依赖于共享库。

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

答案 1 :(得分:0)

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

问题在于新作品不是为你的拼图而制作的。它不适合。如果你从与你完全相同的拼图中取出了第100块,那将会奏效。 (“它适用于我的机器”)

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

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

此stackoverflow问题可能会帮助您走正确的道路。在不更改代码的情况下,如果编写良好,您可以更改编译器标志以生成两个不同的目标图像(拼图)

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

您的编译器可能会尖叫各种警告,具体取决于您编写程序的方式与操作系统中的位数无关。

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