rust交叉编译树莓派程序(代码片段)

fengyc fengyc     2023-04-26     346

关键词:

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-ld"

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

然后用按照不同的开发机、目标机类型,使用 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 工具来删掉一些符号,从而减少整个可执行文件的体积。

树莓派学习笔记交叉编译概念及安装使用(代码片段)

一、交叉编译概念1、什么是交叉编译交叉编译:是在一个平台上生成另一个平台上的可执行代码。              我们在windows上面编写C51代码,并编译成可执行代码,如xx.hex,                       ... 查看详情

树莓派3b交叉编译64位内核(代码片段)

摘录自:https://kasiviswanathanblog.wordpress.com/2017/04/09/raspberry-pi-3-compile-your-own-64-bit-linux-kernel/apt-getupdateapt-getinstallgitbcgitclone--depth=1git://github.com/raspberrypi/tools.gitgitc 查看详情

rust交叉编译配置:windows上编译linux可执行程序(代码片段)

rust交叉编译配置:windows上编译linux可执行程序简述交叉编译大概指在在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码.本次,我们配置的是在windows上编译出在linux上运行的rust可执行程序.我们在安装rust... 查看详情

驱动代码编译和测试(代码片段)

目录一、交叉编译测试文件及驱动发送至树莓派1、驱动编译与发送2、测试文件交叉编译与发送二、测试驱动1、加载内核驱动2、更改权限3、运行测试文件调用驱动一、交叉编译测试文件及驱动发送至树莓派1、驱动编译与发送驱... 查看详情

搭建树莓派交叉编译环境

...linux环境中搭建本地开发与编译环境4.在虚拟机linux上搭建交叉编译环境5.开发一段简单的程序,通过本地编译后,再进行交叉编译。之后将编译好的程序放到树莓派上执行进行测试。 查看详情

搭建树莓派交叉编译环境

...linux环境中搭建本地开发与编译环境4.在虚拟机linux上搭建交叉编译环境5.开发一段简单的程序,通过本地编译后,再进行交叉编译。之后将编译好的程序放到树莓派上执行进行测试。 查看详情

rust交叉编译和不依赖glic之类的编译(内嵌这些依赖库)(代码片段)

通过命令查看支持哪些OS和CPU架构rustc--printtarget-list|pr-tw100--columns3通过ldd命令可以查看编译出来的程序是否依赖动态链接库:1.先普通编译,比如cargobuild--release(没有--release则是编译在debug目录)2.通过ldd命令查看:lddtarget/release/... 查看详情

在树莓派的交叉编译 qt 中构建应用程序时出错

】在树莓派的交叉编译qt中构建应用程序时出错【英文标题】:Errorwhilebuildingappincross-compiledqtinraspberry【发布时间】:2015-02-1302:27:51【问题描述】:我正在尝试在树莓派中的交叉编译qt5上构建和应用程序。这个应用程序是基于这... 查看详情

交叉编译C++树莓派标准错误

】交叉编译C++树莓派标准错误【英文标题】:Crosscompilec++forraspberrypistderror【发布时间】:2014-07-0708:05:04【问题描述】:我需要为RaspberryPi(armV6)交叉编译C/C++代码。我按照http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-co... 查看详情

rust库交叉编译以及在android与ios中使用(代码片段)

本篇是关于交叉编译Rust库,生成Android和iOS的二进制文件(so与a文件),以及简单的集成使用。1.环境系统:macOS13.0M1Pro,Windows10Python:3.9.6Rust:1.66.1NDK:21.4.7075529这里就不具体说明以上环境的安装配置了,... 查看详情

ubuntu交叉编译国产开发板香橙派的环境配置(代码片段)

Ubuntu交叉编译国产开发板香橙派的环境配置一、目的二、准备工具三、操作步骤1.ubuntu安装交叉编译工具2.建一个demo程序a.c3.编译4.检查文件信息四、开发板上设置1.检查环境2.动态库处理一、目的在Ubuntu上编译香橙派运行的c/c+... 查看详情

ubuntuqt交叉编译(树莓派2b)

...成另一个平台上的可执行代码。为什么要大费周折的进行交叉编译呢?一句话:不得已而为之。有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,... 查看详情

为 ARM 交叉编译 Rust 程序时的 ALSA 链接

】为ARM交叉编译Rust程序时的ALSA链接【英文标题】:ALSAlinkingwhencross-compilingRustprogramforARM【发布时间】:2019-11-2400:38:33【问题描述】:我正在尝试交叉编译一个简单的Rust程序,以便在安装了libasound-dev库的Docker容器内使用wavycrate在... 查看详情

交叉编译到树莓派时 JPEG 图像质量下降

】交叉编译到树莓派时JPEG图像质量下降【英文标题】:JPEGimagequalitydecreasesoncrosscompiletoraspberrypi【发布时间】:2019-12-0909:06:02【问题描述】:我正在尝试在我的树莓派上使用qtquick项目。我的项目中有一个jpeg图像。问题是当我将... 查看详情

为树莓派 3 交叉编译 QtModules

】为树莓派3交叉编译QtModules【英文标题】:CrosscompileQtModulesforraspberrypi3【发布时间】:2017-10-1814:17:42【问题描述】:在按照https://wiki.qt.io/RaspberryPi2EGLFS#Step_by_step指南成功编译qtbase之后,我需要在Ubuntux64上为picm3交叉编译QSerialPort... 查看详情

为树莓派交叉编译 bcm2835-1.42 库。

】为树莓派交叉编译bcm2835-1.42库。【英文标题】:CrossCompilebcm2835-1.42libraryforraspberrypi.【发布时间】:2015-04-0810:11:26【问题描述】:我正在尝试在Ubuntu中为我的树莓派板交叉编译库bcm2835-1.42。下载库并使用以下命令进行交叉编译... 查看详情

为树莓派 pi3 交叉编译 Qt 时出错

】为树莓派pi3交叉编译Qt时出错【英文标题】:ErrorwhilecrosscompilingQtforaraspberrypi3【发布时间】:2017-10-0920:52:12【问题描述】:我想交叉编译Qt为树莓派开发一个gui。我一直在关注这个教程:https://wiki.qt.io/RaspberryPi2EGLFS我正在使用... 查看详情

由于交叉编译树莓派,未定义对“Adafruit_GFX 的 vtable”的引用

】由于交叉编译树莓派,未定义对“Adafruit_GFX的vtable”的引用【英文标题】:Undefinedrefenceto\'vtableforAdafruit_GFX\'duecrosscompilingraspberrypi【发布时间】:2016-05-1420:33:21【问题描述】:在Visualstudio中通过尝试交叉编译到树莓派,我收到... 查看详情