使用Arm Mac 构建 Rust Linux等环境

因为在Mac下缺少一些基础的依赖,所以在Mac下打包Linux的程序会失败,所以我们将采用Corss进行交叉编译来实现.

Cross官方地址

功能

  • cross将提供交叉汇编所需的所有成分,而无需触摸您的系统安装。
  • cross提供了一个可产生最便携式二进制文件的环境,跨工具链和交叉编译的库。
  • cross可以测试I686和X86_64以外的架构。
  • 支持稳定版、测试版和预览版通道。

依赖

  • rustup
  • 进行交叉测试需要支持 binfmt_misc的Linux内核。
  • Docker / Podman

原理

cross将调用容器内的依赖进行打包

快速开始

安装

cargo install cross --git https://github.com/cross-rs/cross

使用

cross 可以通过 target 主动寻找对应的 docker 镜像运行容器.当编译成功后会自动删除容器.

cross build --target aarch64-unknown-linux-gnu

问题

当使用 M芯片的 Mac 的时候就会出现提示找不到这是因为 aarch64-unknown-linux-gnu 的 docker 并未打包为 arm 架构所以我们可以预先下载镜像

docker pull ghcr.io/cross-rs/aarch64-unknown-linux-gnu --platform linux/amd64

支持目标

Target libc GCC C++ QEMU test
aarch64-linux-android [1] 9.0.8 9.0.8 6.1.0
aarch64-unknown-linux-gnu 2.31 9.4.0 6.1.0
aarch64-unknown-linux-gnu:centos [7] 2.17 4.8.5 4.2.1
aarch64-unknown-linux-musl 1.2.3 9.2.0 6.1.0
arm-linux-androideabi [1] 9.0.8 9.0.8 6.1.0
arm-unknown-linux-gnueabi 2.31 9.4.0 6.1.0
arm-unknown-linux-gnueabihf 2.31 8.5.0 6.1.0
arm-unknown-linux-musleabi 1.2.3 9.2.0 6.1.0
arm-unknown-linux-musleabihf 1.2.3 9.2.0 6.1.0
armv5te-unknown-linux-gnueabi 2.31 9.4.0 6.1.0
armv5te-unknown-linux-musleabi 1.2.3 9.2.0 6.1.0
armv7-linux-androideabi [1] 9.0.8 9.0.8 6.1.0
armv7-unknown-linux-gnueabi 2.31 9.4.0 6.1.0
armv7-unknown-linux-gnueabihf 2.31 9.4.0 6.1.0
armv7-unknown-linux-musleabi 1.2.3 9.2.0 6.1.0
armv7-unknown-linux-musleabihf 1.2.3 9.2.0 6.1.0
i586-unknown-linux-gnu 2.31 9.4.0 N/A
i586-unknown-linux-musl 1.2.3 9.2.0 N/A
i686-unknown-freebsd 1.5 6.4.0 N/A
i686-linux-android [1] 9.0.8 9.0.8 6.1.0
i686-pc-windows-gnu N/A 9.4 N/A
i686-unknown-linux-gnu 2.31 9.4.0 6.1.0
loongarch64-unknown-linux-gnu 2.36 14.2.0 8.2.2
loongarch64-unknown-linux-musl 1.2.5 14.2.0 8.2.2
mips-unknown-linux-gnu 2.30 9.4.0 6.1.0
mips-unknown-linux-musl 1.2.3 9.2.0 6.1.0
mips64-unknown-linux-gnuabi64 2.30 9.4.0 6.1.0
mips64-unknown-linux-muslabi64 1.2.3 9.2.0 6.1.0
mips64el-unknown-linux-gnuabi64 2.30 9.4.0 6.1.0
mips64el-unknown-linux-muslabi64 1.2.3 9.2.0 6.1.0
mipsel-unknown-linux-gnu 2.30 9.4.0 6.1.0
mipsel-unknown-linux-musl 1.2.3 9.2.0 6.1.0
powerpc-unknown-linux-gnu 2.31 9.4.0 6.1.0
powerpc64-unknown-linux-gnu 2.31 9.4.0 6.1.0
powerpc64le-unknown-linux-gnu 2.31 9.4.0 6.1.0
riscv64gc-unknown-linux-gnu 2.35 11.4.0 8.2.2
s390x-unknown-linux-gnu 2.31 9.4.0 6.1.0
sparc64-unknown-linux-gnu 2.31 9.4.0 6.1.0
sparcv9-sun-solaris 1.22.7 8.4.0 N/A
thumbv6m-none-eabi [4] 3.3.0 9.2.1 N/A
thumbv7em-none-eabi [4] 3.3.0 9.2.1 N/A
thumbv7em-none-eabihf [4] 3.3.0 9.2.1 N/A
thumbv7m-none-eabi [4] 3.3.0 9.2.1 N/A
thumbv7neon-linux-androideabi [1] 9.0.8 9.0.8 6.1.0
thumbv7neon-unknown-linux-gnueabihf 2.31 9.4.0 N/A
thumbv8m.base-none-eabi [4] 3.3.0 9.2.1 N/A
thumbv8m.main-none-eabi [4] 3.3.0 9.2.1 N/A
thumbv8m.main-none-eabihf [4] 3.3.0 9.2.1 N/A
wasm32-unknown-emscripten [6] 3.1.14 15.0.0 N/A
x86_64-linux-android [1] 9.0.8 9.0.8 6.1.0
x86_64-pc-windows-gnu N/A 9.3 N/A
x86_64-pc-solaris 1.22.7 8.4.0 N/A
x86_64-unknown-freebsd 1.5 6.4.0 N/A
x86_64-unknown-dragonfly [2] [3] 6.0.1 10.3.0 N/A
x86_64-unknown-illumos 1.20.4 8.4.0 N/A
x86_64-unknown-linux-gnu 2.31 9.4.0 6.1.0
x86_64-unknown-linux-gnu:centos [5] 2.17 4.8.5 4.2.1
x86_64-unknown-linux-musl 1.2.3 9.2.0 N/A
x86_64-unknown-netbsd [3] 9.2.0 9.4.0 N/A