如果编译后的源代码特定于编译它的硬件,我们如何分发编译后的源代码?
How can we distribute compiled source code if it is specific to the hardware it was compiled on?
假设我们采用编译语言,例如C++
。现在让我们举一个例子Framework,假设Qt
。 Qt
公开了其源代码,并为用户提供了下载二进制文件并让用户使用其 API 的选项。然而,我的问题是,当他们编译他们的代码时,它被编译到他们特定的硬件、操作系统,所有这些东西。我知道有多少软件需要针对不同类型的操作系统(包括 32 位和 64 位)重新编译,并在他们的网站上提供多个下载,但是如何不进一步暗示它也是硬件特定的并最终导致重新分发已编译的执行起来非常令人沮丧?
代码被编译为目标基础 CPU(例如 32 位 x86、x86_64 或 ARM),但不一定是 特定的 处理器比如酷睿 i9-10900K。默认情况下,编译器通常会在最广泛的处理器上生成 运行 的代码。英特尔和 AMD 保证 运行 在更新的处理器上使用该代码的前向兼容性。编译器通常会提供用于在具有新指令集的较新处理器上优化到 运行 的开关,但您很少这样做,因为并非所有客户都有该配置。或者您可能构建了两次代码(一次用于较旧的处理器,一次优化构建用于较新的处理器)。
还有一个概念叫交叉编译。这就是编译器为完全不同于 运行 的处理器生成代码的地方。当您在 Mac 上构建 iOS 应用程序时就是这种情况。编译器本身是一个 x86_64 程序,但它在 iPhone.
上生成 ARM CPU 指令集 运行
代码被编译并 link 与一组特定的 OS APIs 和外部 运行time 库(包括 C/C++ 运行时间)。如果你想让你的代码在 Windows 7 或 Mac OSX Maverics 上 运行,你不会静态地 link 到 API仅存在于 Windows 10 或 Mac OS 大苏尔。该代码可以编译,但它不会 运行 在较旧的操作系统上。相反,您将采取变通办法或有条件地加载 API(如果可用)。 Microsoft 和 Apple 提供了前向兼容性,即提供相同的 运行 时间库 API,以便在以后的 OS 版本中可用。
另外 Windows 支持 运行 在 64 位芯片上运行 32 位进程和 OS。 Mac 甚至可以在今年晚些时候推出的基于 ARM 的新设备上模拟 x86_64。但是我跑题了。
至于 Qt,他们实际上提供了几个预构建的配置供其参考二进制下载。因为,至少在 Windows 上,MSVCRT(Visual Studio 的 C-运行time APIs)与 Visual Studio 的不同编译器版本紧密相关。因此,他们提供各种下载以匹配您要为其构建代码的配置(32 位、64 位、VS2017、VS2019 等)。因此,当您将一个完整的应用程序与第 3 方依赖项放在一起时,必须考虑其中的一些构建、linkage 和 CPU/OS 配置。
假设我们采用编译语言,例如C++
。现在让我们举一个例子Framework,假设Qt
。 Qt
公开了其源代码,并为用户提供了下载二进制文件并让用户使用其 API 的选项。然而,我的问题是,当他们编译他们的代码时,它被编译到他们特定的硬件、操作系统,所有这些东西。我知道有多少软件需要针对不同类型的操作系统(包括 32 位和 64 位)重新编译,并在他们的网站上提供多个下载,但是如何不进一步暗示它也是硬件特定的并最终导致重新分发已编译的执行起来非常令人沮丧?
代码被编译为目标基础 CPU(例如 32 位 x86、x86_64 或 ARM),但不一定是 特定的 处理器比如酷睿 i9-10900K。默认情况下,编译器通常会在最广泛的处理器上生成 运行 的代码。英特尔和 AMD 保证 运行 在更新的处理器上使用该代码的前向兼容性。编译器通常会提供用于在具有新指令集的较新处理器上优化到 运行 的开关,但您很少这样做,因为并非所有客户都有该配置。或者您可能构建了两次代码(一次用于较旧的处理器,一次优化构建用于较新的处理器)。
还有一个概念叫交叉编译。这就是编译器为完全不同于 运行 的处理器生成代码的地方。当您在 Mac 上构建 iOS 应用程序时就是这种情况。编译器本身是一个 x86_64 程序,但它在 iPhone.
上生成 ARM CPU 指令集 运行代码被编译并 link 与一组特定的 OS APIs 和外部 运行time 库(包括 C/C++ 运行时间)。如果你想让你的代码在 Windows 7 或 Mac OSX Maverics 上 运行,你不会静态地 link 到 API仅存在于 Windows 10 或 Mac OS 大苏尔。该代码可以编译,但它不会 运行 在较旧的操作系统上。相反,您将采取变通办法或有条件地加载 API(如果可用)。 Microsoft 和 Apple 提供了前向兼容性,即提供相同的 运行 时间库 API,以便在以后的 OS 版本中可用。
另外 Windows 支持 运行 在 64 位芯片上运行 32 位进程和 OS。 Mac 甚至可以在今年晚些时候推出的基于 ARM 的新设备上模拟 x86_64。但是我跑题了。
至于 Qt,他们实际上提供了几个预构建的配置供其参考二进制下载。因为,至少在 Windows 上,MSVCRT(Visual Studio 的 C-运行time APIs)与 Visual Studio 的不同编译器版本紧密相关。因此,他们提供各种下载以匹配您要为其构建代码的配置(32 位、64 位、VS2017、VS2019 等)。因此,当您将一个完整的应用程序与第 3 方依赖项放在一起时,必须考虑其中的一些构建、linkage 和 CPU/OS 配置。