分类 Rust 下的文章

交叉编译是现代语言非常有用的特性,本地平台编译目标平台所需的可执行文件或者动态链接库,在没有目标平台编译环境的情况下,依然可以发布我们的程序。正如Golang,Rust也支持交叉编译,不过使用起来比Golang麻烦点。

1、首先介绍下本地编译与交叉编译的概念:

  • 本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行:比如,我们在Mac Darwin平台上,编写程序并编译成可执行程序。这种方式下,我们使用 Darwin平台上的工具,开发针对Darwin平台本身的可执行程序,这个编译过程称为本地编译;
  • 交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:比如,我们在Darwin平台上,编写程序并编译成能运行在Linux平台的程序,编译得到的程序在Darwin平台上是不能运行的,必须放到Linux平台上才能运行。

2、下面以Mac上编译Linux程序为例,介绍Rust交叉编译步骤:
(1)安装musl-cross 工具
musl-cross 是用来专门编译到 linux 的工具链

brew install FiloSottile/musl-cross/musl-cross 

(2)查看Rust支持平台

rustup target list

支持的平台非常多

powerpc64le-unknown-linux-gnu
s390x-unknown-linux-gnu
sparc64-unknown-linux-gnu
thumbv7neon-linux-androideabi
thumbv7neon-unknown-linux-gnueabihf
x86_64-linux-android
x86_64-unknown-linux-gnu
x86_64-unknown-linux-gnux32
x86_64-unknown-linux-musl (installed)
...

我们选择x86_64-unknown-linux-musl,后面会用到这个tag。

(3)~/.cargo/config配置参数

[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"

(4)安装第三条在config配置的target.x86_64-unknown-linux-musl工具

rustup target add x86_64-unknown-linux-musl

(5)准备源代码进行交叉编译

cargo build --target=x86_64-unknown-linux-musl

编译到其他平台同理!