在WSL中交叉编译rust

背景

用rust的axum库做了一个简单的小后端系统。需要在linux服务器上部署。

本地开发环境是windows11 经过测试交叉编译相当麻烦,各种报错。今天尝试使用WSL环境进行编译。

开始

首先安装wsl,安装的链接:

WSL 安装与使用 | EESΛST Docs (eesast.com)

直接在这个文档中找到“<二> 在其他磁盘中安装 WSL 2(推荐)”

安装完成后,打开cmd,输入指令。

1
wsl --list

查看所有的linux。看到一个Ubantu

1
wsl -d Ubantu

进入wsl中Ubantu系统的控制台。

然后发现 在这个系统中, 根目录有一个 /mnt (他是mount的缩写,挂载了其他的盘)文件夹,里面有c文件夹和d文件夹。恰好就是自己的c盘和d盘。

相当于linux系统中自动挂载了自己的windows系统的磁盘卷。

接下来就又需要在这个Ubantu中安装rust编译器了。

1
2
3
4
5
6
# 更新包索引列表:
sudo apt update
# 安装必要的构建工具和依赖项:
sudo apt install curl build-essential
# 使用官方推荐的方法安装rustup,这是管理和安装Rust编译器及其工具链的工具:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

在安装过程中会出现一个询问,我当时直接回车。

安装好了之后用一下这个指令。

1
source $HOME/.cargo/env

添加一下编译工具

1
2
3
rustup target add x86_64-unknown-linux-gnu

rustup target add x86_64-unknown-linux-musl # 还是这个靠谱

开始编译

1
cargo build --release --target x86_64-unknown-linux-musl

注意要用 musl 这个来编译。不能用gnu的那个,因为现在服务器是centos8,wsl里的linux是Ubantu,两个系统的Glibc 版本不一样。

等服务器过期了以后打算直接换Ubantu了。之前因为看鱼皮的视频买的Centos8,现在有点后悔。

编译好了之后直接

1
target/x86_64-unknown-linux-musl/release/

在这个文件夹里面找到没有后缀名的,名称和项目名称一样的linux可执行文件。

直接把可执行文件丢到服务器上就可以了。

这时候还是有要注意的一点:

  • 静态链接 Musl 而非 Glibc 意味着你的程序将不依赖于任何特定版本的 Glibc,而是自带了所有必需的C库函数实现。
  • 不是所有的 Rust 库都能很好地与 Musl 兼容,特别是在涉及系统调用或者依赖特定 glibc 行为的情况下。在编译前,确保你的项目和依赖的第三方库都可以在 Musl 上正常工作。