在Win上编译Rust程序到MacOS和Linux
我之前写过一篇文章介绍如何在Windows下编译适用于Linux的Rust程序,不过Rust原生的配置方法并不算简单,今天我想介绍一个更简单的方法来编译Rust程序到MacOS和Linux。同理,也可以在这些平台上编译到Windows。
Cross-rs
Cross-rs是一个Rust的交叉编译工具,在依赖不复杂的情况下,几乎能够一条指令就将Rust程序编译到其他平台。它的原理是使用Docker来运行交叉编译的工具链,因此需要机子上有Docker或Podman。这个库也支持测试,这不是本文章关注的内容,因此只在这提一下。
安装
值得注意的是,由于这个项目依赖Docker,所以在编译时需要保持网络畅通,Docker Hub的镜像下载速度可能会很慢,建议使用你能快速访问的镜像源。
在确保 Rust 工具链、Docker 或 Podman 已经安装的情况下,使用以下命令安装 cross:
1 | cargo install cross --git https://github.com/cross-rs/cross |
基本用法
对于简单的项目,安装完成后就可以直接使用 cross 来编译了:
1 | # 编译到目标架构是x86_64的Linux |
这里以我以前练手写的一个Socks5代理软件为例,编译结果如下:
1 | cross build --target x86_64-unknown-linux-gnu --release |
可见,基本上分为以下几个阶段:
- 安装目标平台的工具链
- 下载用于编译的Docker镜像
- 编译程序
然后我们就得到了一个在Linux上运行的可执行文件,位于target/x86_64-unknown-linux-gnu/release/socks5_tcp
。然而,在面对复杂的项目时,可能会需要处理外部依赖;而编译到MacOS或MSVC目标时,需要处理一些额外的配置,请看下方章节。
处理外部依赖
为了对编译过程做一些定制,我们需要在项目根目录下创建一个Cross.toml
文件,内容如下:
1 | # 此处格式为 `target.<target-triple>`,可以存在多个不同目标的配置 |
基本上配置方法就是如上,如果需要进一步定制,请参考官方文档。
编译到MacOS
由于许可原因,cross-rs
团队无法为我们提供预编译好的镜像,也不被允许分发Apple的SDK,所以我们需要自己以合法方式获取到SDK,进而编译一个镜像。下方我以aarch64-apple-darwin
为例,其他平台类似。
编译镜像
我们需要克隆cross-rs
的代码,并更新子模块,完成配置后构建镜像:
1 | # Setup cross toolchains |
构建对SDK版本要求如下:
- i686-apple-darwin: SDK <= 10.13
- x86_64-apple-darwin: SDK <= 13.0 or SDK <= 12.4
- aarch64-apple-darwin: SDK >= 10.16 and (SDK <= 13.0 or SDK <= 12.4)
配置 Cross.tomml
构建完毕后,就很简单了,我们只需要在项目根目录下创建一个Cross.toml
文件,指定对应目标使用我们的本地镜像,内容如下:
1 | # Reference: https://github.com/cross-rs/cross-toolchains |
后续的编译就和Linux一样了,不再赘述。
编译到Windows
MSVC或许是Windows下最优的目标,然而为了方便起见,我还是选择了GNU工具链。我们可以使用x86_64-pc-windows-gnu
或i686-pc-windows-gnu
作为目标,编译方法和Linux类似:
1 | cross build --target x86_64-pc-windows-gnu --release |
这样我们就能够在Linux或MacOS上编译出Windows下的可执行文件了,不需要配置MSVC。如果你非常想要MSVC的编译结果,请自行阅读官方仓库的README和Issue吧。
在Win上编译Rust程序到MacOS和Linux