【问题标题】:How to make same compiled C code work on different architectures without compiling it again?如何使相同的编译 C 代码在不同的架构上工作而无需再次编译?
【发布时间】:2015-09-27 15:43:17
【问题描述】:

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

【问题讨论】:

  • 如果你使用交叉编译器,你可以为不同的目标编译你的程序,但这仍然需要为每个目标编译它。
  • 你必须为架构使用模拟器或 C 解释器,它也涵盖了使用的库函数。
  • 编译为 32 位并安装 i386 包。 askubuntu.com/questions/454253/…
  • 对该问题的反对票正在制造麻烦。堆栈溢出说我的问题没有得到社区的良好回应。所以他们已经阻止了我5天。让我知道如何删除问题或任何替代解决方案。我是社区的新手。

标签: c computer-architecture


【解决方案1】:

“无法执行二进制文件”可能是由许多不同的原因引起的。如果架构确实不同,那么除了重新编译它(好吧,除了运行原始操作系统和处理器架构的模拟器,但就是这样)或将代码重写为某种编译中间形式之外,你别无希望,例如可以编译为 Java 字节码的 Java,它本身可以通过具有执行代码的“Java 虚拟机”来移植。

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

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

【讨论】:

    【解决方案2】:

    假设您正在做一个 100 块拼图游戏,但您丢失了一块。所以你从另一个拼图中偷了一块,所以你的拼图中有 100 块。

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2016-09-21
      相关资源
      最近更新 更多