rust 交叉編譯樹莓派程序


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 工具來刪掉一些符號,從而減少整個可執行文件的體積。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM