Rust交叉编译

Rust交叉编译

实际上 Cargo 已经准备了很多目标平台,我们可以通过 rustup target list 命令来查看可以交叉编译的平台。

复制代码
x86_64-apple-darwin (installed)
x86_64-apple-ios
x86_64-fortanix-unknown-sgx
x86_64-linux-android
x86_64-pc-solaris
x86_64-pc-windows-gnu (installed)
x86_64-pc-windows-gnullvm
x86_64-pc-windows-msvc
x86_64-unknown-freebsd
x86_64-unknown-fuchsia
x86_64-unknown-illumos
x86_64-unknown-linux-gnu (installed)
x86_64-unknown-linux-gnux32
x86_64-unknown-linux-musl
x86_64-unknown-linux-ohos
x86_64-unknown-netbsd
x86_64-unknown-none

对于 Windows 和 Linux 而言,大多数情况下,通过rustup target add xxx安装目标平台的支持之后,就可以使用
cargo build -r --target xxx 来编译出对应平台的可执行文件。但是在编译 MacOS 的时候遇到了问题,它需要 macOS SDK,对于普通场景而言,你只需要在 MacOS 上编译就行了,但是对于自动化的构建流程而言,这将是极大的麻烦。但是 zig 有一个强大的工具链,支持交叉编译和多版本的 glibc(Rust 不支持低版本的 glibc)。我们借助 zig 的编译链来增强 rust 的交叉编译能力。

cargo-zigbuild

cargo-zigbuild 项目使用 zig 作为链接器来编译 rust 项目,极大的方便我们交叉编译 rust 项目。

安装

可以使用 cargo install 来安装

复制代码
cargo install --locked cargo-zigbuild

也可以使用 pip 来安装

复制代码
pip install cargo-zigbuild

无论是那种方式,都会自动安装 ziglang

除此之外,该项目还提供了一个 Docker 镜像,除了 cargo-zigbuild 和 Rust 之外,它还预装了 macOS SDK,来帮助我们针对 MacOS 进行编译。例如,针对 x86_64 架构的 MacOS 进行构建。

在 rust 项目目录下,执行下面的命令,即可针对 x86_64 架构的 MacOS 进行构建

复制代码
docker run --rm -it -v $(pwd):/io -w /io messense/cargo-zigbuild cargo zigbuild --release --target x86_64-apple-darwin

当然了,你也可以分步操作,首先进入容器,然后在进行项目构建。在我们这里,可能需要对镜像做一个改造,因为镜像里的 rust 仓库是 crates.io,我们需要换源。也可以将准备好的配置文件挂载到容器上去。例如:

复制代码
docker run --rm -it -v $(pwd):/io -v $(pwd)/config.toml:/usr/local/cargo/config.toml -w /io messense/cargo-zigbuild cargo zigbuild --release --target x86_64-apple-darwin

这样就可以将当前目录下的 config.toml 挂载到容器的 /usr/local/cargo/config.toml, 这样就可以使用国内的镜像源了,能够极大的提高下载速度。

使用

前面在 docker 镜像这里提到了如何使用,其实非常简单,只需要下面一行命令即可:

复制代码
cargo zigbuild --target aarch64-unknown-linux-gnu --release

这样就完成了交叉编译到目标平台。

指定 glibc 版本

cargo zigbuild 支持在选项中传递 glibc 版本,例如, 要针对 glibc 2.17 进行编译,目标是:aarch64-unknown-linux-gnu

此时,你可以在目标后面加上 glibc 的版本:

复制代码
cargo zigbuild --target aarch64-unknown-linux-gnu.2.17

macOS universal2 目标

cargo zigbuild 支持在 Rust 1.64.0 及更高版本上构建 macOS universal2 二进制文件/库的特殊目标

例如:

复制代码
rustup target add x86_64-apple-darwin
rustup target add aarch64-apple-darwin

cargo zigbuild --target universal2-apple-darwin

对于编译完成的 MacOS 平台的二进制文件,你会发现有 strip 执行失败的警告。尝试手动使用 strip 命令去除符号和调试信息,也会失败。

这时候,我们需要安装 cargo-binutils,它可以帮助我们方便地调用 Rust 内置的 LLVM binutils

复制代码
cargo install cargo-binutils
ustup component add llvm-tools-preview

安装完成 LLVM 套件之后,我们会有一个 rust-objcopy 的命令可用,可以通过 rust-objcopy 将可执行程序中的多余信息给剥离。

复制代码
rust-objcopy xxx --strip-all -O binary xxx-darwin-universal2
相关推荐
coding4u3 小时前
Mac 外接显示器完全指南:从插上线到调好每个参数
macos·计算机外设·文件管理·显示器·策略模式·quick look扩展
zhyf1193 小时前
(Mac)Homebrew部署Obsidian+Claudian+Excalidraw
macos
chuan.bai3 小时前
Java RAG 实战(第 3 篇):从交互式聊天到多轮上下文
java·人工智能·macos·ai
Chennn__4 小时前
开源项目:Recorder — 本地离线 macOS 录音转文字(通用/课堂/雅思,可选 Ollama)
macos
AUV11075 小时前
录系统声音用什么 Mac 录屏软件:双音源到成片的五层验收
macos
Albart5755 小时前
【玩转 AtomCode】替代Claude Code!开源多模型免费AI编码Agent深度实测教程
人工智能·rust·开源·atomcode·多模型ai
特立独行的猫A5 小时前
Rust+Tauri 2实现个人聚藏APP:一个 “注定上不了“ 的个人收藏夹
rust
jeffwang6 小时前
我把同一个压测做错了三次,第四次才发现真正的瓶颈
分布式·性能优化·rust
chuan.bai6 小时前
Java RAG 实战专栏导读:从零跑通 Ollama + Qdrant + Spring Boot 知识库
java·人工智能·macos·ai
向阳是我7 小时前
两台 Mac 远程共享屏幕最佳方案:Tailscale + macOS 原生屏幕共享
macos