DEV Community

drake
drake

Posted on

如何用rust构建openwrt armv7l CPU架构的可执行程序

  • 1、安装binutils-arm-linux-gnueabihf

如果是ubuntu或者debain就用 apt install;macos用brew install

apt install binutils-arm-linux-gnueabihf
Enter fullscreen mode Exit fullscreen mode

armv7l 依赖的编译器链是:binutils-arm-linux-gnueabihf

  • 2、利用rustup下载并安装armv7l平台的交叉编译工具链
rustup target add armv7-unknown-linux-musleabihf
Enter fullscreen mode Exit fullscreen mode

需要注意的是rust安装的依赖工具链名称和系统依赖的编译器链的名称不同

  • 3、开始编译
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_LINKER=arm-linux-gnueabihf-ld cargo build --target=armv7-unknown-linux-musleabihf --release
Enter fullscreen mode Exit fullscreen mode

这里面的几个参数的含义解释:

3.1、CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_LINKER=arm-linux-gnueabihf-ld强制指定编译器链;armv7l平台就得指定arm-linux-gnueabihf-ld;当然指定的方式有很多种,也可以在项目根目录的Cargo.toml中配置,也可以配置环境变量的方式实现:

export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_MUSLEABIHF_LINKER=arm-linux-gnueabihf-ld
cargo build --target=armv7-unknown-linux-musleabihf --release
Enter fullscreen mode Exit fullscreen mode

CARGO_TARGET_意义等同于cargo build --target中的--target目标平台的意思;
ARMV7_UNKNOWN_LINUX_MUSLEABIHF就是平台在rust中的特定名称,与--target=armv7-unknown-linux-musleabihfarmv7-unknown-linux-musleabihf一致;
_LINKER链的概念,和前面几个参数组合在一块的意思就是:这个平台的构建用哪一个编译器链

3.2、--target=armv7-unknown-linux-musleabihf 指定平台

3.3、--release 字面意思就是发行,其实就是要上线的版本的意思,这个参数构建出来文件是经过优化的

  • 4、构建结果存放的目录

target/armv7-unknown-linux-musleabihf/release

Image description

  • 5、不同开发环境构建的速度

我在centos (16C 32G)上构建的速度要比Macos(M2芯片)上快很多很多,不清楚为什么

Top comments (0)