是什么使得很难说Windows上的可视C ++编译器生成linux二进制可执行文件?
除了不愿意微软这样做,绝对没有。障碍不是技术性的。
开发工具链只是接受输入并产生输出的程序。Visual C ++生成x86程序集,然后使用汇编程序将其转换为COFF目标文件。如果微软想让它生成ELF,那只是代码:汇编进入,ELF退出。目标文件或库没有什么神奇的;它们只是一种易于理解的格式的数据。
回到石器时代,交叉编译要困难得多,因为通常情况下,您会在目标平台的运行平台上组装工具链。这意味着,如果世界上只有VAX,M68K和Alpha架构,那么一整套交叉编译器将需要编写其中的九个,大多数都是从头开始的。(VAX到VAX,VAX到M68K,VAX到Alpha,M68K到VAX,M68K到M68K等),这有点夸张,因为可以重复使用VAX编译器的某些部分,附加到每个目标的代码生成器(例如,分别为VAX编写的VAX,M68K和Alpha)。
当我们开始使用与特定处理器(例如C)无关的语言来编写编译器时,这个问题就消失了。走这条路线意味着您需要用C编写整个工具链一次,并使用针对本地平台的书面形式用C编译器来构建它。(在本地平台的编译器上自举后,通常会使用编译器进行重新编译,但这是另一个讨论。)这样做的结果是,构建交叉编译器的工作基本上与在其上构建本机编译器相同。本地平台。唯一的显着区别是,在构建过程中的某个地方,您告诉它在目标平台的代码生成器中进行编译,而不是在本地平台的代码生成器中进行编译,这将是合理的选择。
随着编译器体系结构的发展,在产品中轻松包含并构建所有代码生成器并选择在运行时使用哪个代码生成器变得很方便。Clang / LLVM可以做到这一点,我敢肯定还有其他人。
一旦有了有效的工具链(编译器,汇编器,链接器),就可以从源代码构建库,最终您将获得为其他平台生成可执行文件所需的一切。