Rust针对树莓派的交叉编译开发

树莓派(Raspberry Pi)相信很多同学都有所了解,不了解的可参考树莓派官网。树莓派通俗点讲 是一台运行Linux的ARM处理器的电脑,因此在上面可以运行诸多Linux所拥有的应用程序。一般来说,主要的编程语言是Python,但其他语言 也能够在其上被支持。而Rust相较于Python有更低的内存占用以及更高的执行效率,能更好的提高rpi资源的利用率。然而,如果你的rust工程 较大时,迫于rpi的硬件性能等问题,编译工程就变得相对有些让人抓狂了,甚至在利用多个核心进行编译时,可能还会出现编译错误的问题。 因此,这里介绍如何使用rust在普通的PC环境下,编译生成运行于树莓派的执行程序。

前期准备工作

既然这里要使用rust,自然rust的是必不可少的。根据官方的建议,使用rustup进行安装。通过执行以下命令,添加armv7的编译支持。

rustup target add armv7-unknown-linux-gnueabihf

同时,你需要有针对armv7的gcc套件,这样rust才能够将代码链接成能运行于rpi的程序。可以从linaro 上下载。目前rpi官方系统应该选择 arm-linux-gnueabihf 这个。下载解压之后,将其中bin目录配置到PATH路径中。

生成工程

新建一个目录,通过以下的命令初始化rust的工程,如果你是rust的老手,请忽略。

cargo new --bin hello

此时会在命令执行的目录下,生成一个hello的目录,并将其初始化为rust的工程目录。之后的所有操作都将在该目录下操作。

增加对arm7的配置

在生成的目录下,新建名为 .cargo/config 配置文件,其文件内容如下。

# .cargo/config
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"

其中 arm-linux-gnueabihf-gcc 可以直接用你实际的路径替代,这个配置的作用是用来告诉rust,采用该链接器,来构建可执行程序。

进行编译

此时,可以通过执行以下命令对程序进行编译。

cargo build --target=armv7-unknown-linux-gnuebihf

如果要发布执行程序,那么可以通过加上 –release 编译没有调试信息的release版本,这样应用程序相对会占用更少的资源。其命令类似如下。

cargo build --target=armv7-unknown-linux-gnuebihf --release

可执行程序的位置

由于你当前的开发环境可能是amd64环境的,因此arm7的执行程序是无法在你本地的系统上被执行的。因此,只有复制到rpi上,才能够对改程序进行 运行测试。而相应的可执行程序的在以下目录中,在该目录下会有一个与你项目同名的执行文件。一般来说,将其复制到rpi上即可运行。

target/armv7-unknown-linux-gnueabihf/release/

总结及说明

对于大多数情况下,rust写的程序在你常用的amd64架构的平台上于rpi所用的arm7架构在代码上是通用的,因此开发测试的时候,可以当作一般的 应用程序在本地进行调试开发,待需要验证测试的时候,再利用交叉编译生成rpi的执行程序,在实体机上进行测试。而作为能编译生成高性能原生 执行程序的rust来说,对比C/C++而言,他在项目依赖的管理,以及交叉编译的支持上都更为优秀。而其生成的代码在相同功能下,有着比Python和 Go更好的资源利用率,因此在树莓派这类硬件资源较为紧张的平台上,能更充分的利用好系统资源。