rust 交叉編譯樹莓派程序
使用 rust 寫樹莓派程序時,如果直接在樹莓派上進行編譯,速度非常慢,如果是 zero 那更加是慢到受不了。因此最好是能通過開發機編譯完后,直接放到樹莓派上運行。
由於開發機上的 cpu 架構、操作系統和目標機不同,開發機通常是 x86 架構,系統可以是 mac、linux、windows,而樹莓派則為 armv6 或 armv7 的 linux 系統。未經過特殊處理,默認的編譯工具鏈編譯出的程序只適合開發機上運行,為特定目標編譯需要一套別的編譯工具鏈,這種方法被稱為交叉編譯 cross compilation。
要注意,不同版本的樹莓派的 cpu 架構不一樣,具體可查看
cat /proc/cpuinfo
linux 上進行交叉編譯
linux 上需要安裝 gcc 的交叉編譯工具
sudo apt-get install gcc-arm-linux-gnueabihf
然后通過 rustup 安裝不同的目標支持
rustup target add arm-unknown-linux-gnueabihf # armv6
rustup target add armv7-unknown-linux-gnueabihf # armv7
mac 上進行交叉編譯
現在已經有開發者把交叉編譯工具做個 brew 安裝腳本,安裝
brew install FiloSottile/musl-cross/musl-cross --without-x86_64 --with-arm-hf
這個交叉編譯工具使用的是 musl c 庫,跨平台,性能比 glibc 要差一點。
然后通過 rustup 安裝不同的目標支持
rustup target add arm-unknown-linux-musleabihf # armv6
rustup target add armv7-unknown-linux-musleabihf # armv7
編譯設置
在項目下創建一個 .cargo/config
文件,內容為
[target.arm-unknown-linux-musleabihf]
linker = "arm-linux-musleabihf-ld"
[target.armv7-unknown-linux-musleabihf]
linker = "arm-linux-musleabihf-ld"
[target.arm-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
然后用按照不同的開發機、目標機類型,使用 cargo 進行編譯
cargo build --target arm-unknown-linux-gnueabihf --release # armv6, linux
cargo build --target armv7-unknown-linux-gnueabihf --release # armv7, linux
cargo build --target arm-unknown-linux-musleabihf --release # armv6, mac
cargo build --target armv7-unknown-linux-musleabihf --release # armv7, mac
編譯完后,在 target/<目標類型>/release
中可找到對應的可執行文件,copy 到目標上就可以運行。
這個文件也可使用 strip 工具來刪掉一些符號,從而減少整個可執行文件的體積。