在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 | # 更新包索引列表: |
在安装过程中会出现一个询问,我当时直接回车。
安装好了之后用一下这个指令。
1 | source $HOME/.cargo/env |
添加一下编译工具
1 | rustup target add x86_64-unknown-linux-gnu |
开始编译
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 上正常工作。