先说结论。
在主机 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
,原因未知。
2023-05-21 更新
随手搜了一下刚好看到了一篇近期文章,意思是 64 位编译 32 位时 GCC 需要传递 -m32
参数,反之用 -m64
。那么在 Rust 里就需要写编译脚本 build.rs
,有点麻烦。
贴个机翻:如何在 WSL 中解决 cannot execute binary file Exec format error 错误
后续遇到过 No package 'openssl' found
错误,简单说就是需要更新环境:
笔记在这里:解决 WSL openssl not found 报错
首先安装 WSL,教程网上有。然后可能需要安装 curl,看这里:WSL curl: command not found 和 Unable to locate package 报错。
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 add x86_64-pc-windows-gnu
不安装会报错:
error: linker `cc` not found
|
= note: No such file or directory (os error 2)
error: aborting due to previous error
解决方案:
sudo pacman -S base-devel
sudo apt install build-essential
yum -y install gcc
参考:Rust error “linker ‘cc’ not found” for Debian on Windows
不安装报错:
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。
gcc-multilib
,可以试一下 sudo apt-get install gcc-multilib
。Rust 团队还提供了一套交叉编译工具,Repo 在这里:Cross,但是要求安装 Docker 或者 Podman,我看了一下两个貌似都不支持 WSL1 安装,WSL2 应该可以。相关参考: