• Github 中文镜像
Sign inSign up
Watch966
Star102.4k
Fork61.8k
Tag: rust
Switch branches/tags
Branches
Tags
K / 在 WSL 中安装 Rust 交叉编译环境和报错解决.md
移动浏览 Clone
加载中...
到移动设备上浏览
99 lines 9.51 KB
First commit on 6 Jul 2021

    结论

    先说结论。

    问题一

    在主机 Windows 10 WSL Debian 中安装的 x86_64-unknown-linux-gnu toolchain,增加 x86_64-pc-windows-gnu 的 target 交叉编译到 Windows 没有问题。

    有问题的是从 Linux 交叉编译到 target i686-pc-windows-gnu,会报错:

    error: linking with `i686-w64-mingw32-gcc` failed: exit status: 1
    
      = note: "i686-w64-mingw32-gcc" "-fno-use-linker-plugin" "-Wl,--dynamicbase" "-Wl,--disable-auto-image-base" "-Wl,--large-address-aware" "-Wl,--nxcompat"
    ...
      = note: /usr/bin/i686-w64-mingw32-ld: 
    ...
    undefined reference to `_Unwind_Resume'
    ...
    undefined reference to `_Unwind_RaiseException'
    ...
    more undefined references to `_Unwind_Resume' follow
              collect2: error: ld returned 1 exit status
    
    error: aborting due to previous error
    

    也就是说 64 位 Liunx 交叉编译 64 位 Windows 程序没有问题,但是不能交叉编译 32 位 Windows 程序。

    关于这个问题的原因见:#32859/207842638,在 #32859/210364708 有一个解决方案(我没有试)。

    问题二

    我写的 Rust 应用在 64 位 WSL 上编译 32 位的 Linux 二进制包,没有报错,但实际运行会报错:exec format error,原因未知。

    安装 WSL

    首先安装 WSL,教程网上有。然后可能需要安装 curl,看这里:WSL curl: command not found 和 Unable to locate package 报错

    在 WSL 中安装 Rust

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    

    会自动下载安装器,之后显示:

    Current installation options:
    
       default host triple: x86_64-unknown-linux-gnu
         default toolchain: stable (default)
                   profile: default
      modify PATH variable: yes
    
    1) Proceed with installation (default)
    2) Customize installation
    3) Cancel installation
    

    默认安装直接回车。自定义安装输入 2 然后回车,根据提示自己填,可选的 host tools 在这里:Other ways to install rustup

    Rustup 添加 Target

    rustup target add x86_64-pc-windows-gnu
    

    安装 GCC 工具链

    不安装会报错:

    error: linker `cc` not found
      |
      = note: No such file or directory (os error 2)
    
    error: aborting due to previous error
    

    解决方案:

    • for Arch Linux:sudo pacman -S base-devel
    • for Debian/Ubuntu:sudo apt install build-essential
    • for CentOS:yum -y install gcc

    参考:Rust error “linker ‘cc’ not found” for Debian on Windows

    安装 MinGW-w64

    不安装报错:

    error occurred: Failed to find tool. Is `i686-w64-mingw32-gcc` installed?
    

    或者

    error occurred: Failed to find tool. Is `x86_64-w64-mingw32-gcc` installed?
    

    解决:

    sudo apt-get install mingw-w64
    

    测试

    cargo new hello-world
    cd hello-world
    cargo build --target x86_64-pc-windows-gnu
    

    编译成功则说明没有问题了。

    其他错误

    如果你看到类似这种错误:

    /home/a/.rustup/toolchains/stable-i686-unknown-linux-gnu/bin/cargo: 1: /home/a/.rustup/toolchains/stable-i686-unknown-linux-gnu/bin/cargo: ELF0: not found
    /home/a/.rustup/toolchains/stable-i686-unknown-linux-gnu/bin/cargo: 18: /home/a/.rustup/toolchains/stable-i686-unknown-linux-gnu/bin/cargo: Syntax error: word unexpected
    

    说明你的 host tool 安装错了。比如在 64 位系统上安装了 32 位的 toolchain。

    • 2021-07-07 更新:
      • 也可能是因为没有安装 gcc-multilib,可以试一下 sudo apt-get install gcc-multilib

    官方 Cross 安装

    Rust 团队还提供了一套交叉编译工具,Repo 在这里:Cross,但是要求安装 Docker 或者 Podman,我看了一下两个貌似都不支持 WSL1 安装,WSL2 应该可以。相关参考:

    其他参考