*-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 测试套件在交叉编译时通过,但 rustdoc
和 ui-fulldeps
除外,它们会因缺少库而失败,但在本地构建时会通过。唯一失败的测试是 std 的 process::tests::test_proc_thread_attributes
,原因不明。
交叉编译工具链和 C 代码
只要使用基于 LLVM 的 C 工具链,兼容的 C 代码就可以使用 Clang 的 aarch64-pc-windows-gnu
、i686-pc-windows-gnullvm
和 x86_64-pc-windows-gnu
目标构建。这些包括