好像一年没更新文章了. 今天刚入手了一个树莓派Zero来折腾. 本来是拿来做笔记本的网络唤醒助手的, 打算用 rust 来写个 daemon 来处理. 先折腾个环境…
Host Environment
Arch Linux
Target Environment
Arch Linux arm
arm gcc 的安装
由于 Arch 的官方源里面没有 arm linux 的交叉工具链, 只有一个 arm-none
的 gcc
, 不过这个是用来编译 arm bare metal 的, 并不能拿来编译 linux 的应用, 只能去 aur 上找 arm-linux
的 gcc
由于树莓派Zero 用的 BCM2835 是 armv6
架构的, 于是找到了这个, 如果是用的别的板子, 自己看着办吧
依赖了不少东西, 整一个试试.
为了方便我直接用了 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
可以了.