rust交叉编译配置:windows上编译linux可执行程序

发布时间 2023-04-25 11:53:27作者: sqhhhhAA111i

rust交叉编译配置:windows上编译linux可执行程序

简述

交叉编译大概指在在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码.

本次,我们配置的是在windows上编译出在linux上运行的rust可执行程序.

我们在安装rust之后,默认会安装跟机器环境搭配的编译相关工具.而其他平台的编译工具就需要我们自己去安装了.
通过如下命令查看rust当前的编译工具:

rustup show

查看rust其他支持的编译工具链工具:

rustup target list
# 其中标注了(installed)的表示已安装

其中以gnu为后缀的表示动态编译,即很多包依赖与系统原有的,不打入可执行程序中,这可能造成把程序放在某些机器上执行错误的情况,好处是编译后体积较小.

而以msvc或者musl为后缀的,表示静态编译,即把这个程序相关的代码都打进去,只要执行环境(即编译工具前面的描述x86_64_windows什么的一致)就能执行,缺点是编译后体积较大.

尝试常规方法配置windows上编译linux的环境遇到各种环境失败之后,决定采用cross方案.

cross介绍

cross仓库地址 :  https://github.com/cross-rs/cross

cross大概步骤就是通过docker起一个你编译目标的环境,然后把代码扔过去编译,完成后把结果放到项目的target目录下.

这种方式,一劳永逸,并且可拓展性很强,不会遇到各种问题.因此决定采用cross.

cross项目地址上也有教程,请留心查看.
其中,cross的使用跟cargo命令相似:

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

$ cross test --target mips64-unknown-linux-gnuabi64

$ cross rustc --target powerpc-unknown-linux-gnu --release -- -C lto

使用步骤

1. 在cargo上安装cross工具

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

2. 安装docker

此处不详细介绍,注意windows和linux安装docker步骤不一样,windows上需要开启某项系统功能.

具体见: https://www.runoob.com/docker/windows-docker-install.html

注意,需要将docker配置为国内镜像源,但是国内镜像有的已经不能使用了,
我目前的配置如下:

"registry-mirrors": [
    "https://5ba5frns.mirror.aliyuncs.com",
    "https://mirror.baidubce.com"
  ]

3. 拉取相关镜像

如果直接就开始使用,默认拉取的是github仓库的镜像,国内环境网速不行,且没有相关国内镜像源,试了若干次,都以卡死告终.

幸好,有人已经拉取成功并上传到其他仓库中,这些仓库包含在我们配置的国内仓库中,因此可以顺利拉取.

使用以下命令拉取:

docker pull japaric/x86_64-unknown-linux-musl

4. 项目中配置cross,指定image

因为我们使用的不是默认的image,所以要在项目中配置说明,在项目Cargo.toml中添加如下:

[package.metadata.cross.target.x86_64-unknown-linux-musl]
image = "japaric/x86_64-unknown-linux-musl"

4. 开始编译

此处就可以开始使用corss编译了,我们的镜像是 x86_64-unknown-linux-musl,
注意指定target,那么在项目中执行如下命令即可:

cross build --release --target x86_64-unknown-linux-musl