*-pc-windows-gnullvm

层级:2(无主机工具)

类似于 *-pc-windows-gnu 的 Windows 目标,但使用 UCRT 作为运行时,并使用各种 LLVM 工具/库而不是 GCC/Binutils。

目前可用的目标三元组

  • aarch64-pc-windows-gnullvm
  • i686-pc-windows-gnullvm
  • x86_64-pc-windows-gnullvm

目标维护者

要求

获取这些目标的最简单方法是交叉编译,但从 x86_64-pc-windows-gnu 进行本地构建是可能的,但需要一些技巧,我不建议这样做。Std 支持预计与 *-pc-windows-gnu 相当。

此目标的二进制文件在要求和功能方面至少应与 *-pc-windows-gnu 相当。

这些目标遵循 Windows 调用约定,用于 extern "C"

与任何其他 Windows 目标一样,创建的二进制文件采用 PE 格式。

构建目标

可以使用 llvm-mingw 工具链或 MSYS2 CLANG* 环境轻松地交叉编译这些目标。只需填写 [target.*] 部分,用于构建和生成的编译器,并在 config.toml 中设置安装前缀。然后运行 ./x.py install。在我的情况下,我在 MSYS2 MINGW64 shell 中运行了 ./x.py install --host x86_64-pc-windows-gnullvm --target x86_64-pc-windows-gnullvm,因此 x86_64-pc-windows-gnu 是我的构建工具链。

本地引导可以通过两种方式完成

  • 交叉编译 gnullvm 主机工具链,并将其用作下一个构建的构建工具链。
  • 复制 libunwind 库并重命名它们以模仿 libgcc,例如:https://github.com/msys2/MINGW-packages/blob/68e640756df2df6df6afa60f025e3f936e7b977c/mingw-w64-rust/PKGBUILD#L108-L109,stage0 编译器将大部分损坏,但足以构建下一个阶段。

第二个选项可能随时停止工作,因此不建议使用。

构建 Rust 程序

Rust 为这些目标提供预编译的 std 库。这意味着如果安装了 C 正确的工具链,则可以轻松地从其他主机交叉编译这些目标。

或者,可以按照上一节中的说明构建完整的工具链。

测试

创建的二进制文件在 Windows 或 Wine 上使用本地硬件可以正常工作。但是,在 x86_64 上测试 AArch64 存在问题,需要花一些时间使用 QEMU。大多数 x86_64 测试套件在交叉编译时通过,但 rustdocui-fulldeps 除外,它们会因缺少库而失败,但在本地构建时会通过。唯一失败的测试是 std 的 process::tests::test_proc_thread_attributes,原因不明。

交叉编译工具链和 C 代码

只要使用基于 LLVM 的 C 工具链,兼容的 C 代码就可以使用 Clang 的 aarch64-pc-windows-gnui686-pc-windows-gnullvmx86_64-pc-windows-gnu 目标构建。这些包括