Rust交叉编译开发环境的搭建

2023-11-08

为嵌入式开发引入新的编程语言

对于嵌入式系统软件和应用软件的开发而言,编程语言的重要性次于整体的软件架构设计的重要性。不过仍有必要谨慎地选择编程语言,因为这涉及开发效率、软件性能,以及团队成员的技术能力。譬如,若整个嵌入式软件的绝大数组件是用C++编写的,那么招聘一些对C++不十分熟悉的开发人员,就是团队建设的不合理了:精通C++的开发人员相对较少。对于小型的团队,选择一些不常用的编程语言,(短期内)不用考虑团队建设的问题,同时可以很大程度上提升开发效率、减少软件缺陷,提高软件的可维护性、可扩展性。随着嵌入设备的性能越来越高,可以在嵌入式设备上选择Golang/NodeJS/MicroPython等高级的(脚本)编程语言来进行开发。Rust是一门新兴的系统编程语言,强大的语言特性及良好的底层设计,使得它可以为Cortex-M系列的ARM单片机写裸应用,可以在执行效上媲美C/C++,可以在面向对象编程方面接近Java。甚至目前开源社区正在努力将其整合到Linux内核中,作为Linux内核驱动开发的第二种编程语言。不过现在常用Rust语言开发的,可能在深度学习算法和区块链等领域。

本文记录了而笔者搭建Rust交叉编译环境的搭建过程,并在树霉派设备上运行了第一个由Rust编写的Hello World程序。

为系统安装Rust开发环境

笔者常用的系统为ubuntu,可以通过官方软件源来安装Rust开发环境:

sudo apt install build-essential rustc rust-doc cargo cargo-doc

安装过后,可以通过浏览器打开/usr/share/doc/rust-doc/html/index.html文件,包含了Rust的官方文档,含有丰富的开发资料。不过这种方式安装的Rust开发环境不能进行交叉编译,缺少rustup命令行工具。该工具需要通过snap来安装,但国内访问snap源因网络问题很不容易。最终笔者选译通过Rust官方推荐的安装方式来安装。

安装的操作比较简单,首先,以超级用户执行:

export CARGO_HOME=/opt/rust-lang/cargo
export RUSTUP_HOME=/opt/rust-lang/rustup
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > sh.rustup.rs
sh ./sh.rustup.rs

上面的两行export指令指示cargorustup的安装路径。执行sh.rustup.rs脚本就会执行Rust开发环境的安装。这是一个交互的安装过程,当提示选择时,选译第一个选项。以下是安装过程,根据网络环境的不同,可以会持续十几分钟:

root@rustling:~# sh ./sh.rustup.rs
info: downloading installer

Welcome to Rust!

This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  /opt/rust-lang/rustup

This can be modified with the RUSTUP_HOME environment variable.

The Cargo home directory located at:

  /opt/rust-lang/cargo

This can be modified with the CARGO_HOME environment variable.

The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:

  /opt/rust-lang/cargo/bin

This path will then be added to your PATH environment variable by
modifying the profile files located at:

  /root/.profile
  /root/.bashrc

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:


   default host triple: x86_64-unknown-linux-gnu
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1

info: profile set to 'default'
info: default host triple is x86_64-unknown-linux-gnu
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: latest update on 2021-05-10, rust version 1.52.1 (9bc8c42bb 2021-05-09)
info: downloading component 'cargo'
  6.0 MiB /   6.0 MiB (100 %)   2.7 MiB/s in  2s ETA:  0s
info: downloading component 'clippy'
info: downloading component 'rust-docs'
 15.3 MiB /  15.3 MiB (100 %) 537.9 KiB/s in 21s ETA:  0s
info: downloading component 'rust-std'
 24.1 MiB /  24.1 MiB (100 %)   1.9 MiB/s in 18s ETA:  0s
info: downloading component 'rustc'
 48.4 MiB /  48.4 MiB (100 %)  50.3 KiB/s in  2m  7s ETA:  0s
info: downloading component 'rustfmt'
  3.6 MiB /   3.6 MiB (100 %) 351.4 KiB/s in 16s ETA:  0s
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
 15.3 MiB /  15.3 MiB (100 %)   3.7 MiB/s in  3s ETA:  0s
info: installing component 'rust-std'
 24.1 MiB /  24.1 MiB (100 %)   7.9 MiB/s in  3s ETA:  0s
info: installing component 'rustc'
 48.4 MiB /  48.4 MiB (100 %)   9.2 MiB/s in  5s ETA:  0s
info: installing component 'rustfmt'
info: default toolchain set to 'stable-x86_64-unknown-linux-gnu'

  stable-x86_64-unknown-linux-gnu installed - rustc 1.52.1 (9bc8c42bb 2021-05-09)


Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory (/opt/rust-lang/cargo/bin).

To configure your current shell, run:
source /opt/rust-lang/cargo/env

为上面安装的Rust开发环境增加交叉编译支持

以上操作仅为开发系统安装了Rust开发环境,要进行交叉编译,仍需要以下操作:

source /opt/rust-lang/cargo/env
rustup target add aarch64-unknown-linux-gnu
rustup target add armv7-unknown-linux-gnueabihf

笔者安装了两个交叉编译Rust的支持:32位ARM和64位ARM。不过仍需要安装两者的gcc交叉编译器,因为Rust在构建时会调用aarch64-linux-gnu-gcc等工具做为链接器。这个安装过程不再赘述,可以自行安装。以上操作完成后,就可以切换到普通用户,进行第一个Rust应用的交叉编译了。首先要配置环境变量:

export CARGO_HOME=/opt/rust-lang/cargo
export RUSTUP_HOME=/opt/rust-lang/rustup
export PATH=${CARGO_HOME}/bin:/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH=${PATH}:/opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin

之后,创建简单的可执行应用,并在主机上编译运行:

cargo new --bin hello
cd hello
cargo build
cargo run

以上操作的结果为:

yejq@rustling:~/hello$ cargo build
   Compiling hello v0.1.0 (/home/yejq/hello)
    Finished dev [unoptimized + debuginfo] target(s) in 7.73s
yejq@rustling:~/hello$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.04s
     Running `target/debug/hello`
Hello, world!

至此,为主机搭建的Rust开发环境功能正常。接下来需要为64位ARM交叉编译该简单应用,需要配置交叉编译的链接器:

mkdir ~/.cargo
cat <<EOF > ~/.cargo/config
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-none-linux-gnu-gcc"
EOF
cargo build --release --target=aarch64-unknown-linux-gnu

交叉编译的结果如下:

yejq@rustling:~/hello$ cargo build --release --target=aarch64-unknown-linux-gnu
   Compiling hello v0.1.0 (/home/yejq/hello)
    Finished release [optimized] target(s) in 3.23s
yejq@rustling:~/hello$ ls ./target/
CACHEDIR.TAG  aarch64-unknown-linux-gnu  debug  release
yejq@rustling:~/hello$ ls ./target/aarch64-unknown-linux-gnu/release/
build  deps  examples  hello  hello.d  incremental
yejq@rustling:~/hello$ file ./target/aarch64-unknown-linux-gnu/release/hello
./target/aarch64-unknown-linux-gnu/release/hello: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, with debug_info, not stripped

将交叉编译生成的可执行文件hello复制到嵌入式ARM设备上运行,可以得到期望的结果:

# ./hello
Hello, world!

至此,为嵌入式设备搭建Rust交叉编译开发环境就完成了,以后可以在嵌入式设备上用Rust编程语言来开发系统应用了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust交叉编译开发环境的搭建 的相关文章

随机推荐

  • Go语言面试题--基础语法(14)

    文章目录 1 切片 a b c 的长度和容量分别是多少 2 下面代码中 A B 两处应该怎么修改才能顺利编译 3 下面代码输出什么 1 切片 a b c 的长度和容量分别是多少 func main s 3 int 1 2 3 a s 0 b
  • 【科普向】谁都能看懂的CRC(循环冗余校验)原理

    CRC原理 简介 CRC基本原理 模二运算 二进制系数多项式 CRC算法 示例 CRC算法的数学描述 常用CRC版本 CRC算法的编程实现 简介 循环冗余校验 Cyclic Redundancy Check CRC 是一种根据网络数据包或计
  • MySQL - MySQL 8.0(二)基本操作:用户

    文章目录 前言 查看当前登录用户 一 创建用户 1 语法介绍 2 创建 dbadmin 用户 仅做了解 二 授予和撤销用户的访问权限 1 授予权限 2 检查授权 3 撤销权限 题外话 修改 mysql user 表 三 修改密码 身份验证插
  • 浅显易懂的GCC使用教程——初级篇

    浅显易懂的GCC使用教程 初级篇 2018 12 17天气暖 属于冬日里出太阳 最近在学习使用gvim 想着抛弃对IDE的依赖同时也是想了解编译的过程 但除了学习gvim繁多的指令外还得先学习使用gcc编译程序 这篇文章将会用浅显易懂的方式
  • [IDEA] 异常 Configuration is still incorrect. Do you want to edit it again? Error: module not specifie

    在Idea打开项目出现 Configuration is still incorrect Do you want to edit it again 的错误提示 点Edit 出现 Error module not specifie 问题 产生
  • el-input使用clearable,:title,MessageBox弹框外部关闭,el-Dropdown 下拉菜单详细举例,el-table的show-overflow-tooltip是什么?

    近期在工作中改测试提出的一些bug 有时候同样一个bug却忘了上一次怎么改的 特此总结分享 1 关于el input使用clearable属性即可得到一个可清空的输入框 2 由于clearable属性引发的一个小bug 如例图 蓝色部分后面
  • OpenCV:判断读取图片是否成功

    摘要 当用imread 读取图片时 如果图片路径错了 或者图片名称 又或者后缀格式错误 程序都会报错 基于这个问题 有时候我们不知道是读取图片失败而报错 会误以为是其它行代码出错了 所以 经常读取图片后 会进行判断图片是否读取成功 如果读出
  • iOS-对于把图片渲染成蓝色的修改方法

    在之前开发的过程中 遇到过这样一个小问题 给button设置一张图片 图片是灰色 美工做的图肯定没有问题 给button设置图片的方法也很简单 一句代码搞定 但是运行的时候却发现 图片无缘无故变成了蓝色 后来自己研究了一下发现 在给一些控件
  • cuDNN下载

    cuDNN下载网址 https developer nvidia com rdp cudnn download 按顺序点击可以看到与cuda相对应版本 点击对应cuda版本的cuDNN下载 例如CUDA11 4对应的版本
  • C语言入门初识(中)

    C语言入门初识 中 常量 常量的分类 1 字面常量 2 const修饰的常变量 3 define 定义的标识符常量 4 枚举常量 字符串 转义字符 注释 字符串 C常用格式转换说明符 转义字符 注释 选择语句与循环语句 选择语句 循环语句
  • 第四次作业

    作业要求 https edu cnblogs com campus hljkj CS201801 homework 2523 预习 1 数组视频全看了 2 学到了一维数组和二维数组 如何定义使用数组 3 数组的排序 不能熟练使用二维数组 只
  • 微信小程序 七天签到组件

    组件效果 组件gitee地址 https gitee com liu bao yi sign in 使用 1 将dk calendar文件夹放进components文件夹内 2 页面json文件引入该组件 usingComponents d
  • 【深入理解Kafka系列】第五章 日志存储

    前几章已经讲解了kafka的基本知识 我们已经能较好的用kafka来完成基本的开发任务 接下来了解一下内部的一些细节 便于知道相关的原理 本章主要讲kafka日志存储相关的知识 1 文件目录布局 回顾之前所学的知识 Kafka 中的消息是以
  • 在ESP32/ESP8266上使用MicroPython利用MQTT发布BME280传感器数据(温度,湿度和压力)

    了解如何使用MicroPython对ESP32或ESP8266板进行编程 以通过MQTT将BME280传感器读数 温度 湿度和压力 发布到支持MQTT或任何MQTT客户端的任何平台 例如 我们将传感器读数发布到Node RED仪表板 注意
  • 神州交换机路由器AC和AP基本配置

    交换机部分 两层和三层交换机清除所有配置的命令 Set default 清除配置 Write 保存 Reload 重启 交换机打开网站管理 http 两层 config ip http server config Web user xxx
  • 51单片机 LCD1602

    LCD1602 H ifndef LCD1602 H define LCD1602 H 用户调用函数 void LCD Init void LCD ShowChar unsigned char Line unsigned char Colu
  • 【解决方案】PicGo图片上传失败问题【少走弯路】

    解决方案 PicGo图片上传失败问题 少走弯路 1 检查Server设置 选择PicGo设置 选择设置Server 确认设置监听端口为 36677 如果没有问题的话可以尝试关闭 退出APP 再开启Server 未能解决再继续操作 2 检查阿
  • Android:手把手带你了解实用的Android Jetpack

    转自 https blog csdn net carson ho article details 104243841 前言 在2018年 Google I O 大会上发布了一系列辅助Android开发者开发的实用工具集合 Jetpack 今
  • Unity制作简单动画效果

    需求 制作一段门旋转的动画 效果如下 解决办法 1 在Unity中点击Window gt Animation gt Animation 调出Animation面板 如下 2 为了让门的轴心在门边上以便于制作门绕门边旋转的效果 需要先新建一个
  • Rust交叉编译开发环境的搭建

    为嵌入式开发引入新的编程语言 对于嵌入式系统软件和应用软件的开发而言 编程语言的重要性次于整体的软件架构设计的重要性 不过仍有必要谨慎地选择编程语言 因为这涉及开发效率 软件性能 以及团队成员的技术能力 譬如 若整个嵌入式软件的绝大数组件是