【问题标题】:C/C++ executable on 32-bit and 64-bit machines [closed]32 位和 64 位机器上的 C/C++ 可执行文件 [关闭]
【发布时间】:2018-05-15 11:52:55
【问题描述】:

是否可以使用 c/c++ 制作一个可以在32-bit64-bit 机器上运行的executable?如果是这样,我该如何制作?

【问题讨论】:

  • 请注意,没有像“C/C++”这样的语言。您要么拥有 C,要么拥有 C++,它们是两种截然不同的语言。
  • 你的目标是什么平台?
  • windows,抱歉我忘了写在那里...
  • @Someprogrammerdude:正确但并不真正相关 - 这里的相关属性是 32 位和 64 位系统之间的共享 ABI,C 或 C++ 不假定。
  • @DunsanAntol:提到 Windows 应该进入问题本身。

标签: c++ executable cpu-architecture


【解决方案1】:

是的,构建一个 32 位可执行文件。它可以在 64 位机器上运行。

【讨论】:

  • 要求操作系统支持32位可执行文件。像 32 位库或 WOW64 (Windows)。
  • 是的,但是由于 OP 没有提供任何有关操作系统或其他要求的信息,我认为他想构建一个 Windows 应用程序。
  • @Antwane:为什么要做出这样的假设?
【解决方案2】:

一般建议(如answered by Antwane)是构建一个 32 位可执行文件。如果操作系统允许,它可能会在 64 位机器上运行。 Linux、Windows 和某些版本的 MacOSX 就是这种情况(但您需要检查)。但是,32 位可执行文件通常使用 32 位 virtual address space(在 Linux 上也可以阅读 x32)并且无法利用当今可用的大量 RAM(因为每个 32 位进程将使用不超过 4 GB 的虚拟内存,并且通常最多 3)。

一些罕见的operating systems 接受了fat binaries,但它们今天已经过时了。

您可能会以某种操作系统特定的方式编写脚本(例如,Unix 上的 shell script,或 Windows 上的 PowerShell 脚​​本)或检测处理器是否为 64 位然后运行 ​​64 位的包装器位可执行。

您可以同时发布可执行文件的 32 位和 64 位变体(并让您的用户决定运行哪个变体)。

您可以考虑使用一些open source 许可证发布(例如在github 上)您的程序的source code,并将编译的负担留给您的用户。

您可能会考虑将您的 C++ 代码(可能使用 Emscripten)编译为 WebAssembly 字节代码,并期望您的用户将您的东西运行到他的浏览器中。但这可能并不容易(因为 WebAssembly 为沙盒目的添加了许多限制,因此在这种情况下您可能无法使用所有 C++11 标准库)。

【讨论】:

    【解决方案3】:

    32 位可执行程序在 64 位机器上工作,但在 windows 的情况下,某些 win32 api 在 64 位机器上运行 32 位应用程序时可能无法工作

    【讨论】:

      【解决方案4】:

      您可以将3264 位放在一个包中。

      Linux 系统中,如果文件中的 5th 字节为 1,则它是一个 32-bit 二进制文件。如果为 2,则为 64-bit。为了增加健全性检查:

      • 如果前 5 个字节为 0x7f、"ELF"1:则为 32 位 ELF 二进制文件。
      • 如果前 5 个字节为 0x7f、"ELF"2:则为 64 位 ELF 二进制文件。
      • 否则:不确定。

      Windows 系统中:

      x86 : PE  L
      x64 : PE  d†
      

      您还可以确认文件实用程序(例如来自cygwin)将区分32-bit64-bit 可执行文件。它们如下所示:

      32.exe: PE32 executable (GUI) Intel 80386, for MS Windows
      64.exe: PE32+ executable (console) x86-64, for MS Windows
      

      【讨论】:

      • 或者直接运行file /path/to/executable,它会识别并解析ELF标头。
      • 因为我看不到它给 OP 带来了什么,而且 w.r.t.其他答案。他告诉(在评论中)他关心 Windows。
      猜你喜欢
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2012-01-16
      • 1970-01-01
      • 2010-10-01
      相关资源
      最近更新 更多