Rust 树莓派交叉编译

好像一年没更新文章了. 今天刚入手了一个树莓派Zero来折腾. 本来是拿来做笔记本的网络唤醒助手的, 打算用 rust 来写个 daemon 来处理. 先折腾个环境…


Host Environment
Arch Linux

Target Environment
Arch Linux arm

arm gcc 的安装

由于 Arch 的官方源里面没有 arm linux 的交叉工具链, 只有一个 arm-nonegcc, 不过这个是用来编译 arm bare metal 的, 并不能拿来编译 linux 的应用, 只能去 aur 上找 arm-linux 的 gcc

由于树莓派Zero 用的 BCM2835 是 armv6 架构的, 于是找到了这个, 如果是用的别的板子, 自己看着办吧

arm-linux-gnueabihf-gcc

依赖了不少东西, 整一个试试.

为了方便我直接用了 pacaur 来处理 aur 的依赖关系, 直接 pacaur -S arm-linux-gnueabihf-gcc 就完事了. 在提醒是否查看 PKGBUILD 的时候记得按 y, 把 build 部分的 make 都加上 -j 参数, 具体看自己 CPU 改了. 不然默认单线程编译, 搞不好一下午就交代了..

整好了

rust 设定

rust target

rust 需要增加一个 armv6 的 target
rustup target add arm-unknown-linux-gnueabihf

armv7 和 armv8, aarch64 的自己看着办吧…

编译一下试试

rustc --target arm-unknown-linux-gnueabihf hello.rs --C linker=arm-linux-gnueabihf-gcc

scp 给板子之后跑一下

还行

Cargo 设定

需要给 cargo 的配置文件里面指定 arm-unknown-linux-gnueabihf 的 linker.

默认配置一般在 ~/.cargo/config 这里, 没有就创一个.

加上

[target.arm-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"

来告诉 cargo 在编译到 arm-unknown-linux-gnueabihf target 的时候用之前安装的 gcc 做 linker, 不然会默认用 cc 做 linker, 那这当然是不行的.

测试

cargo b --target=arm-unknown-linux-gnueabihf

cargo b --target=arm-unknown-linux-gnueabihf --release

可以了.

发表评论

电子邮件地址不会被公开。 必填项已用*标注