Rust(@Raspberry PI zero)のクロスコンパイル環境構築

当然ながらzeroの能力ではRustのコンパイルには時間かかるので、クロス環境が必要です。以前Golang用のDocker(QEMU環境)では上手くいかなかった、おそらくlinkerの問題なのか、ので代替え案としてIntel MacのVMware環境でのUbuntuで環境作りました。

https://www.freecodecamp.org/news/embedded-rust-programming-on-raspberry-pi-zero-w/

を参考にしています。

いくつか修正が必要だったので、そこを記述します。

・ターゲットインストールのコマンドはtargetとaddが逆になってる

$ rustup target add arm-unknown-linux-gnueabihf configはobslete

 

・~/.cargo/configを使うのは古くて(obsoleteと言われる)コンパイル通らないから、.cargo/config.tomlに入れる(以下のように)てlinker対象ファイルはパスを通すかフルパスで指定

[target.arm-unknown-linux-gnueabihf]

linker = "/rpi_tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc"

 

・hello worldのサンプルプログラムをcargo initで作成(sampleディレクトリに)してコンパイル

fn main() {
    println!("Hello, world! from Ubuntu compiler");
}
$ cargo build --release --target=arm-unknown-linux-gnueabihf

 

・バイナリをラズパイに転送(実行ファイルはsample/target/arm-unknown-linux-gnueabihf/release以下に存在)

$ scp release/sample pi@192.168.1.16:~/sample

 

・ラズパイで実行

$ ./sample

Hello, world! from Ubuntu compiler

 

ただし、

https://github.com/raspberrypi/tools

のページには、

tools

These toolchains are deprecated. They are outdated and easily available from other sources (e.g. direct from Ubuntu apt). e.g.

sudo apt-get install gcc-arm-linux-gnueabihf

とあるので、このやり方の方がスマートなのかもしれない。

クロスコンパイルには他にはcrossとDockerを使うやり方もありますが、それほどのアドバンテージがあるようには思えないから当面この環境かな。

 

admin

 

カテゴリーRust