笔者一直想搞个树莓派来玩,由于囊中羞涩一直没舍得买,加上自己一直是做 Java 开发,树莓派的发挥也不大,就一直处于犹豫徘徊当中。直到这次,实在是忍不住想试试 Rust 嵌入式开发,弄几个传感器搞搞物联网方面的学习,于是狠心从某宝购买了一块4B 的板子。
下单后,就一直等待卖家发货,不停刷新着物流信息,经过两天,板子终于到我手中了。不管三七二十一,先组装好,然后跑个 Hello world 再说。
因为笔者不想直接在板子上搭开发环境,所以就要选择交叉编译,在本地电脑上编译好,再上传到板子里面去,而网上的交叉编译教程基本上都是 Linux 的,虽然跟 macOS 差别不是很大,但笔者还是觉得应该总结一下,并把这个过程分享出来。
有些朋友可能对交叉编译并不是很理解,这里笔者简述一下:当需要在 Windows 系统下编译 Linux 、 Android 或者 macOS 平台的目标文件时,就需要用到交叉编译,反过来说在 Linux 系统要编译 Windows 平台的应用,同样是需要用到交叉编译。交叉编译也不仅仅是指跨操作系统,还跟 cpu 架构有关。例如笔者情况就是在 macOS x86_64 的架构上将目标文件编译成 Linux arm7 架构可以运行的。
先来看一看笔者的板子
再往下就是整个交叉编译的过程了。
1、查看树莓派架构
uname -m
输出 armv7l 说明是 arm7 处理器,因此我们在 macOS 上要安装 arm7 相关编译器。
2、安装 arm7 架构的 gcc
# 下载
wget https://mac.musl.cc/armv7l-linux-musleabihf-cross.tgz
# 解压到制定目录
tar zxvf armv7l-linux-musleabihf-cross.tgz -C $$HOME
# 配置环境变量
vim ~/.profile
export PATH="$$PATH:$$HOME/armv7l-linux-musleabihf-cross/bin"
source ~/.profile
# 测试安装结果
armv7l-linux-musleabihf-gcc -v
注意:$$HOME为变量(实际对应当前用户目录),改成你需要的路径就可以了。
3、安装 rust 对应的 target
rustup target add armv7-unknown-linux-musleabihf
使用 rustup target add 命令添加目标平台,简单方便。
4、创建 rust 项目
cargo new hellopi --bin
5、在 rust 项目下配置 .cargo/config 文件为以下内容
[target.armv7-unknown-linux-musleabihf]
linker="armv7l-linux-musleabihf-gcc"
6、交叉编译
cargo run --target=armv7-unknown-linux-musleabihf
# 或者
cargo run --target=armv7-unknown-linux-musleabihf --release
编译后在 ./target 目录下会生成一个目标平台文件夹 armv7-unknown-linux-musleabihf 而编译结果就在这个文件夹对应的 debug/release 目录下。
7、上传目标文件到树莓派
scp ./target/armv7-unknown-linux-musleabihf/release/hellopi pi@192.168.1.100:/home/pi
8、在树莓派上执行目标文件
# 使用 ssh 命令登录到树莓派,在 /home/pi 中执行目标文件
./hellopi
# 输出
Hello, world!