suika
文章14
标签15
分类2

修复 GNU 版本的 Rust 在 Windows 上的兼容性问题

你可能会在构建包含 C/C++ 的 Rust 程序上遇到一些问题。

比如出现以下报错提示:

undefined reference to `__imp___acrt_iob_func'

为了便于你理解当前内容,请确保你已经阅读过 此文

修复方案

  1. 移除 Rust 自带的 rust-mingw
  2. 修复移除 rust-mingw 带来的问题

移除 Rust 自带的 rust-mingw

命令行工具 rustup 默认是不提供移除 Rust 自带的 rust-mingw 的功能,但是可以通过手动修改相应的配置文件,让 rustup 支持移除 rust-mingw:

  1. 打开 C:\Users\<username>\.rustup\toolchains\<release_channel>-x86_64-pc-windows-gnu\lib\rustlib\multirust-channel-manifest.toml 配置文件

    • <username>:当前系统登录的用户名
    • <release_channel>:Rust 发布渠道,可能的值有(Stable 、Beta、Nightly)
  2. 找到以下内容:

    [[pkg.rust.target.x86_64-pc-windows-gnu.components]]
    pkg = "rust-mingw"
    target = "x86_64-pc-windows-gnu"
    
    [[pkg.rust.target.i686-pc-windows-gnu.components]]
    pkg = "rust-mingw"
    target = "i686-pc-windows-gnu"

    替换成:

    [[pkg.rust.target.x86_64-pc-windows-gnu.extensions]]
    pkg = "rust-mingw"
    target = "x86_64-pc-windows-gnu"
    
    [[pkg.rust.target.i686-pc-windows-gnu.extensions]]
    pkg = "rust-mingw"
    target = "i686-pc-windows-gnu"
  3. 打开 cmd 或 PowerShell 运行以下命令:

     rustup component remove rust-mingw

修复移除 rust-mingw 带来的问题

拷贝 <msys2_path>\mingw64\x86_64-w64-mingw32\lib 目录下的 crt2.o 和 dllcrt2.o 文件到 C:\Users\<username>\.rustup\toolchains\<release_channel>-x86_64-pc-windows-gnu\lib\rustlib\x86_64-pc-windows-gnu\lib 目录,替换掉 Rust 自带的 crt2.o 和 dllcrt2.o 文件。

  • <msys2_path>:msys2 的安装目录,例如 D:/msys64
  • <username>:当前系统登录的用户名
  • <release_channel>:Rust 发布渠道,可能的值有(Stable 、Beta、Nightly)

修复脚本 🎉🎉🎉

由于每次执行 rustup update 操作后,都需要按以上流程重新修复此问题,实在是过于繁琐。所以我编写了一个用于自动修复此问题的脚本,已开源在 GitHub 上(附教程)。

本文作者:suika
本文链接:http://suikastar.com/posts/18691/
版权声明:本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议进行许可

少女祈祷中……