前段时间做了rust交叉编译到arm开发板,如果引入的包有些包含OpenSSL,ring...遇见了很多问题在网上也查阅很多资料,今天抽个时间做个汇总吧。
虚拟机里面安装rust环境,做到交叉编译的时候应该都已经有了,这个地方就不过多说了,网上找一下就有的
首先描述一下我的环境吧,用的ubuntu是18.04桌面版,编译的程序放到aarch64开发板上并成功执行,话不多说直接上干货。。。
之前参考这篇文章能编译引入包比较少的程序:
rust交叉编译
1.首先在虚拟机上安装docker镜像(docker没有安装之前之前编译的程序(包含openssl,ring等一系列包)一直编译不成功。这里附个链接是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已经成功安装
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
nano ~/.bashrc
然后插入这段,ctrl+x保存并退出(这个路径就是上面echo $PATH后的路径)
export PATH=/root/.cargo/bin:$PATH
修改完后需要source一下:source ~/.bashrc
验证一下是否成功安装cross:
ls ~/.cargo/bin
查看cross版本:cross --verison
这个地方加上一部分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
第一次发文章,有不足的地方请大家指出。