最近在使用阿里云的Serverless平台使用Rust来写一些小的函数,
但是因为自己的电脑是M1,而阿里云的Serverless不支持Arm平台。
而通过官方建议使用docker来编译的话,速度实在是令人难以接受。
还不如直接在本机交叉编译,速度还能快一些。
既然阿里云的机器不支持arm平台,那么我们的选择就是编译为
x86_64-unknown-linux-gnu 或者编译为x86_64-unknown-linux-musl。
他们的区别是,x86_64-unknown-linux-gnu是不带libc的,
因此要求程序的运行环境有glibc。
而x86_64-unknown-linux-musl自己实现了libc。因此,在x86_64-unknown-linux-musl上编译的程序是没有外部依赖的,在任何linux上都可运行。
x86_64-unknown-linux-gnu
添加rustup支持
rustup target add x86_64-unknown-linux-gnu
安装链接器
brew install SergioBenitez/osxct/x86_64-unknown-linux-gnu
需要注意的是,这个还挺耗时的,需要耐心等待一会儿
项目配置
在项目目录下增加.cargo目录,目录下创建config。这是为了让这个配置只在当前项目生效。如果以后的项目也都有交叉编译的需求,大可直接更改用户目录下的.cargo的config。
config文件加入以下文本
[target.x86_64-unknown-linux-gnu]
linker = "x86_64-unknown-linux-gnu-gcc"
编译
cargo build --release --target x86_64-unknown-linux-gnu
如果编译失败,可尝试指定TARGET_CC来编译
TARGET_CC= x86_64-unknown-linux-gnu cargo build --release --target x86_64-unknown-linux-gnu
不过这种编译的程序可能无法在目标平台上直接运行,因为它需要目标平台有libc。
那么我们就使用下面这种方式
x86_64-unknown-linux-musl
与x86_64-unknown-linux-gnu相同,它也需要这些配置
添加rustup支持
rustup target add x86_64-unknown-linux-musl
安装链接器
brew install FiloSottile/musl-cross/musl-cross
项目配置
config文件加入以下文本
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"
编译
cargo build --target x86_64-unknown-linux-musl
本文档详细介绍了如何在M1 Mac上使用Rust进行交叉编译,以生成可在x86_64-unknown-linux-gnu和x86_64-unknown-linux-musl平台运行的二进制文件。内容包括添加rustup支持、安装链接器、项目配置以及针对两种目标平台的编译步骤。


被折叠的 条评论
为什么被折叠?



