如何在macOS上编译可在AWS EC2实例正常运行的Rust程序
问题根因
两个核心判断错误直接导致问题:
- 编译目标选错:t3.micro是x86_64/amd64架构,你贴的内核版本后缀
amd64已经明确标注了架构属性,aarch64-unknown-linux-gnu是ARM架构(AWS Graviton系列,比如t4g、c6g实例)的编译目标,和当前实例架构完全不匹配。 - 本地编译的二进制天生不兼容:macOS不管是Intel芯片还是M系列芯片,默认
cargo build产出的是对应架构的macOS可执行文件,和Linux系统的ABI不兼容,直接传过去必然报Exec format error。 - 选aarch64目标编译报链接错误,是因为本地默认的
cc是macOS自带的Clang,没有对应目标平台的链接器、系统根文件库,无法直接完成跨平台链接。
可行解决方案
方案1:本地交叉编译(编译完直接传文件到EC2,速度快)
t3.micro对应的正确编译目标是x86_64-unknown-linux-gnu,按以下步骤配置:
- 先给Rust工具链安装对应目标支持:
rustup target add x86_64-unknown-linux-gnu - 用Homebrew安装x86_64 Linux的交叉编译工具链:
brew install SergioBenitez/osxct/x86_64-unknown-linux-gnu - 在项目根目录新建
.cargo/config.toml配置文件,指定对应目标的链接器:[target.x86_64-unknown-linux-gnu] linker = "x86_64-unknown-linux-gnu-gcc" - 执行发布构建:
编译完成的二进制在cargo build --release --target=x86_64-unknown-linux-gnutarget/x86_64-unknown-linux-gnu/release/目录下,SCP传到EC2后加执行权限即可运行:chmod +x 你的二进制文件名
方案2:EC2实例内直接编译(零配置,出错概率最低)
不需要折腾本地交叉编译环境,直接在EC2上编译:
- 把本地的项目源码(不要传之前编译错的二进制)通过SCP传到EC2实例
- 在EC2上安装Rust环境,按官方安装脚本提示走完流程,安装完成后执行
source "$HOME/.cargo/env"加载环境变量 - 进入项目目录执行发布构建:
产出的二进制在cargo build --releasetarget/release/目录下,直接在实例上运行即可,无架构兼容问题。
方案3:Docker跨平台构建(无需本地配置交叉工具链)
如果本地装了Docker,可以直接用官方Rust镜像构建,省去装交叉编译工具的步骤,在项目根目录执行:
docker run --rm -v "$PWD":/app -w /app rust:latest cargo build --release --target x86_64-unknown-linux-gnu
编译完成的二进制路径和方案1一致,直接传到EC2加执行权限就能跑。
补充说明
如果后续换用ARM架构的EC2实例(比如t4g.micro),才需要使用aarch64-unknown-linux-gnu编译目标,对应安装aarch64版本的交叉编译工具链、修改配置里的链接器即可。
内容的提问来源于stack exchange,提问作者Colin Heyl
相关产品推荐
相关产品推荐

