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

How to make same compiled C code work on different architectures without compiling it again?

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

"can not execute binary file" 可能由许多不同的原因引起。如果体系结构确实不同,那么除了重新编译它(好吧,除了 运行 原始 OS 和处理器体系结构的模拟器,但那是)或重写代码以成为一些编译中间形式,例如Java 可以编译成 Java 字节码,它本身可以通过执行代码的 "Java virtual machine" 来移植。

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

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

想象一下,您正在玩​​ 100 块拼图,但您丢失了一块。所以你从另一个拼图中偷了一块,所以你的拼图里就有 100 块。

问题是新拼图不是为您的拼图制作的。它不适合。如果您从与您的完全相同的拼图中取出第 100 块,它就会奏效。 ("it works on my machine")

编译器为您的目标 OS 生成代码。如果您是 64 位的,那么您的编译器可能会默认创建一个 64 位的拼图。如果你的朋友是 运行 32 位的,那么你的 64 位拼图将无法放入他的拼图中。

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

这个 Whosebug 问题可能会帮助您走上正确的道路。不改代码,如果写的好,可以改编译器flags产生两个不同的目标图(拼图)

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

您的编译器可能会发出各种警告,具体取决于您编写程序的方式不依赖于 OS 中的位数。

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