*-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
持平。
这些目标遵循 extern "C"
的 Windows 调用约定。
与任何其他 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
目标构建。这些工具链包括