为什么不能在与最终用户操作系统不同的操作系统上进行编译

为什么不能在与最终用户操作系统不同的操作系统上进行编译

我尝试在 Windows 上编译 php 扩展,但遇到了一些问题。我当时认为可以在 Linux 上编译 Windows,但结果发现这是不可能的。

有人能向我解释为什么编译必须在同一个操作系统上进行吗?我试图理解这个问题,特别是因为如果我想分发某些东西,这是否意味着我必须在所有这些操作系统(Windows 7、Windows Vista、Windows XP、Linux、Mac 等)上编译它。那么是什么原因导致无法在一个操作系统上编译另一个操作系统?是内核还是什么?

答案1

一般而言,在实际执行编译的发行版上进行编译要容易得多,也更可靠。通常存在发行版“系列”,您只需在系列中的一个发行版上进行编译即可。有时,系列会使用一些技巧,让您能够最大限度地减少所需的编译次数。

通常,您可以为所有现代版本的 Windows 制作一个版本。如果您想制作一个原生 64 位应用程序,则需要第二个版本。通常,您可以在任何版本的 Windows 上制作此版本,但通常最简单的方法是在您计划支持的最新版本上制作。(Windows 是例外。在其他平台上,最简单的方法是使用您计划支持的最旧版本。)

您可以为所有配备 Pentium 3 CPU 及以上版本内核的 Linux 平台进行一次构建。虽然需要一些技巧,但还是可以做到的。

您可以为所有 Intel Mac 制作一个版本。同样,这需要一些技巧,但可以做到。

跨操作系统系列进行交叉编译往往弊大于利。无论如何,您都需要本机平台进行测试。对于大型部署,一台额外的机器来构建是没有问题的。对于小型部署,请使用测试机器进行构建——无论如何您都需要它。

主要例外是本来就用于交叉编译的“小型”平台。例如,小型嵌入式系统甚至可能无法在本机平台上进行编译。

答案2

交叉编译是可能的但这并不意味着所有软件都可以交叉编译。有些软件依赖于仅存在于目标平台上的库/组件。有些软件依赖于某些版本的开发工具才能成功构建。

相关内容