如何在 Raspberry Pi 2 上将 Rust 代码编译为 运行?

How can I compile Rust code to run on a Raspberry Pi 2?

我最近获得了一个 Raspberry PI 2,我想在其上 运行 一个 Rust 程序。

有guide/instructions如何在Raspberry PI2上交叉编译Rust程序吗?我听说过 运行在 RPi 或 Arduino 上使用 ning Rust,虽然不是最近。

我想要一个 Hello World 等效的 Rust 程序 运行ning on Raspberry Pi 2. 它不必是一个字面上的 Hello World 程序,只是类似低的东西复杂度。

Rust 编译器未作为 Raspberry Pi 的交叉编译器分发,因此需要使用 rpi 开发工具将其编译为交叉编译器。

  1. 获取 rpi 开发工具 - git clone https://github.com/raspberrypi/tools.git ~/pi-tools

  2. 从 mozilla git repo 获取 rust 编译器并将 rpi 工具添加到路径 export PATH=~/pi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:$PATH

  3. 在家里寻找 rusty-pi 目录 ./configure --target=arm-unknown-linux-gnueabihf --prefix=$HOME/rusty-pi && make && make install

  4. 考虑 helloworld.rs -> % ~/pi-rust/bin/rustc --target=arm-unknown-linux-gnueabihf -C linker=arm-linux-gnueabihf-g++ helloworld.rs

它将生成一个可执行文件。

我们现在有 rustup

$ rustup target add arm-unknown-linux-gnueabihf
$ sudo apt-get install gcc-arm-linux-gnueabihf
$ echo '[target.arm-unknown-linux-gnueabihf]' >> ~/.cargo/config
$ echo 'linker = "arm-linux-gnueabihf-gcc"' >> ~/.cargo/config
$ cd <project dir>
$ cargo build --target=arm-unknown-linux-gnueabihf

will work for Raspberry Pi 2s and 3s (which are ARMv7/8 based), but not for Raspberry Pi 1s or Zeros (which are ARMv6 based).

问题是 Debian/Ubuntu 的 armhf 端口(因此他们的 gcc-arm-linux-gnueabihf package/compiler/toolchain)目标 >= ARMv7.

幸运的是,rustup 的 gcc-arm-linux-gnueabihf 目标 >= ARMv6 (with hardware floating-point, which all Raspberry Pis support), so all that's needed is the correct linker. The Raspberry Pi foundation provides one of those in their tools repository

综合起来,可以使用以下步骤交叉编译适用于所有 Raspberry Pi 的 Rust 二进制文件:

$ rustup target add arm-unknown-linux-gnueabihf
$ git clone --depth=1 https://github.com/raspberrypi/tools raspberrypi-tools
$ echo "[target.arm-unknown-linux-gnueabihf]" >> ~/.cargo/config
$ echo "linker = \"$(pwd)/raspberrypi-tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc\"" >> ~/.cargo/config

测试交叉编译器(假设 Pi 是 运行 并且可以使用默认 raspberrypi 主机名访问):

cpick@devhost:  $ cargo new --bin rpi-test
cpick@devhost:  $ cd rpi-test
cpick@devhost:  $ cargo build --target=arm-unknown-linux-gnueabihf
cpick@devhost:  $ scp target/arm-unknown-linux-gnueabihf/debug/rpi-test pi@raspberrypi:
cpick@devhost:  $ ssh pi@raspberrypi
pi@raspberrypi: $ ./rpi-test
Hello, world!