【问题标题】:How can we distribute compiled source code if it is specific to the hardware it was compiled on?如果编译后的源代码特定于编译它的硬件,我们如何分发它?
【发布时间】:2020-07-11 09:38:31
【问题描述】:

假设我们采用一种编译语言,例如C++。现在让我们举一个例子框架,假设QtQt 的源代码是公开的,用户可以选择下载二进制文件并让用户使用他们的 API。然而,我的问题是,当他们编译他们的代码时,它被编译成他们特定的硬件、操作系统,所有这些东西。我了解有多少软件需要针对不同类型的操作系统(包括 32 位和 64 位)重新编译,并在他们的网站上提供多个下载,但是如何不进一步表明它也是特定于硬件的,并最终导致编译后的重新分发执行起来非常令人沮丧?

【问题讨论】:

  • 我不太确定您在问什么,以及您想知道什么。 however how does it not go even further to suggest it is also Hardware Specific 是什么意思?
  • 我认为当您编译一些源代码时,它会创建特定于 CPU 硬件的指令。这是否意味着如果我在 C++ 中创建了一个可执行文件,我需要将它提供给同样拥有我所拥有的 ware 硬件的其他人?
  • 是的,您为特定架构编译应用程序。并且根据选择的架构,编译器会将源代码转换为特定的 CPU 指令集。然后该二进制文件可以在与该指定架构兼容的任何 CPU 上运行。所以是的,想要运行该二进制文件的人必须拥有支持该指令集的硬件。但这有什么问题呢?

标签: c++ operating-system frameworks compiled


【解决方案1】:

代码被编译到目标基础 CPU(例如 32 位 x86、x86_64 或 ARM),但不一定是像 Core i9-10900K 这样的特定处理器。默认情况下,编译器通常会生成在最广泛的处理器上运行的代码。英特尔和 AMD 保证在较新的处理器上运行该代码的前向兼容性。编译器通常会提供用于优化的开关,以便在具有新指令集的较新处理器上运行,但您很少这样做,因为并非所有客户都拥有该配置。或者,您可能会构建代码两次(一次用于较旧的处理器,而优化构建用于较新的处理器)。

还有一个概念叫做交叉编译。这就是编译器为与其运行的处理器完全不同的处理器生成代码的地方。当您在 Mac 上构建 iOS 应用程序时就是这种情况。编译器本身是一个 x86_64 程序,但它正在生成 ARM CPU 指令集以在 iPhone 上运行。

代码被编译并与一组特定的操作系统 API 和外部运行时库(包括 C/C++ 运行时)链接。如果您希望您的代码在 Windows 7 或 Mac OSX Maverics 上运行,您不会静态链接到仅存在于 Windows 10 或 Mac OS Big Sur 上的 API。代码可以编译,但不能在旧操作系统上运行。相反,如果 API 可用,您会做一个变通方法或有条件地加载它。 Microsoft 和 Apple 提供了前向兼容性,即提供相同的运行时库 API,以便在以后的操作系统版本中使用。

此外,Windows 支持在 64 位芯片和操作系统上运行 32 位进程。 Mac 甚至可以在今年晚些时候推出的基于 ARM 的新设备上模拟 x86_64。但我离题了。

至于 Qt,他们实际上为他们的参考二进制下载提供了几个预构建的配置。因为,至少在 Windows 上,MSVCRT(来自 Visual Studio 的 C 运行时 API)与 Visual Studio 的不同编译器版本密切相关。因此,他们提供各种下载来匹配您想要构建代码的配置(32 位、64 位、VS2017、VS2019 等)。因此,当您将具有 3rd 方依赖项的完整应用程序放在一起时,必须考虑其中的一些构建、链接和 CPU/OS 配置。

【讨论】:

    猜你喜欢
    • 2020-05-05
    • 2012-06-25
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多