前段时间做了rust交叉编译到arm开发板,如果引入的包有些包含OpenSSL,ring...遇见了很多问题在网上也查阅很多资料,今天抽个时间做个汇总吧。

虚拟机里面安装rust环境,做到交叉编译的时候应该都已经有了,这个地方就不过多说了,网上找一下就有的

首先描述一下我的环境吧,用的ubuntu是18.04桌面版,编译的程序放到aarch64开发板上并成功执行,话不多说直接上干货。。。

之前参考这篇文章能编译引入包比较少的程序:

rust交叉编译

1.首先在虚拟机上安装docker镜像(docker没有安装之前之前编译的程序(包含openssl,ring等一系列包)一直编译不成功。这里附个链接是docker安装的官方教程

ubuntu安装docker

顺便把安装指令直接在这个地方写出来,方便参考

1.卸载老版本,如果想卸载老版本docker可以执行,如果新安装跳过这步跳过即可
sudo apt-get remove docker docker-engine docker.io containerd runc

2.更新apt包,
sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

3.添加docker密匙
sudo mkdir -m 0755 -p /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

4.设置存储库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5.下载docker前更新一下apt
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

6.运行hello word镜像验证是否成功安装docker
sudo docker run hello-world




基于docker搭建NX的交叉编译环境 docker 交叉编译arm_rust


返回这个说明docker已经成功安装

2.第一步终于结束了,接下来就是按照rust环境需要用到的cross,用这个指令来实现文件的交叉编译,官方cross包介绍

rust --cross这个里面有介绍cross包的环境和作用可以去看一下,

另外一个配置cross环境变量参考的这个文章:

linux配置环境变量

下面我把这两部分指令放到这个地方方便参考:

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

ubuntu配置环境变量
cd ~/.cargo/bin
这个路径需要和下面写入的一致
echo $PATH


基于docker搭建NX的交叉编译环境 docker 交叉编译arm_arm开发_02


nano ~/.bashrc
然后插入这段,ctrl+x保存并退出(这个路径就是上面echo $PATH后的路径)
export PATH=/root/.cargo/bin:$PATH


基于docker搭建NX的交叉编译环境 docker 交叉编译arm_linux_03


修改完后需要source一下:source ~/.bashrc

验证一下是否成功安装cross:

ls ~/.cargo/bin

查看cross版本:cross --verison


基于docker搭建NX的交叉编译环境 docker 交叉编译arm_rust_04


这个地方加上一部分rust相关的配置,防止后面编译不了

sudo apt update

sudo apt install rustc

rustc –V

curl https://sh.rustup.rs -sSf | sh

source "$HOME/.cargo/env“

rustc –V

到这一步基本上就大功告成了,还剩一点就能编译rust程序到板子上运行了

安装linux里面交叉编译工具链,cross包文档里面用的gun,但是我用gun一直编译不成功,最后用了musl成功了,把这两个都列出来了

apt-get install gcc-aarch64-linux-gnu
apt-get install gcc-aarch64-linux-musl
rustup target add aarch64-unknown-linux-gnu
rustup target add aarch64-unknown-linux-gnu

安装成功后,执行这条命令就能生成目标文件了,大功告成~!

cross build --target aarch64-unknown-linux-musl

如果编译不成功,引入的reqwest有OpenSSL错误,可以在toml文件里面修改一下这个包,

reqwest = { version = "0.11", features = ["json","blocking","rustls-tls"], default-features=false }

如果碰到虚拟机没有网络了可以执行这条命令试一下:sudo dhclient ens33

第一次发文章,有不足的地方请大家指出。