Windows + CodeArts IDE OHOS Rust 交叉编译安装第三方库UUID实战完整开发环境搭建指南

欢迎加入开源鸿蒙PC社区: https://harmonypc.csdn.net/

欢迎在PC社区平台申请新建项目:https://atomgit.com/OpenHarmonyPCDeveloper

AtomGit 仓库地址:https://atomgit.com/OpenHarmonyPCDeveloper/ohos_rust_cargo


前言:

Rust 默认的本地编译模式,是完全依托当前电脑的系统环境完成编译与链接工作。在 Windows 平台直接编写并编译 Rust 程序时,编译器 rustc 能够自动识别当前系统的 CPU 架构、系统内核接口、系统标准库、默认链接器以及系统运行依赖,因此无需额外配置即可直接生成 Windows 平台可执行文件。

如果需要在 Windows 电脑上编译出能够在鸿蒙 OpenHarmony ARM64 设备上运行的程序,就属于典型的跨平台交叉编译场景,本地 Windows 的编译环境、系统库文件、链接工具、系统调用规范与鸿蒙系统完全不兼容,rustc 本身无法自动识别、适配鸿蒙系统的运行机制与硬件架构,因此必须手动补充三套目标平台的核心资源并完成专项配置,否则编译必然出现标准库缺失、系统接口找不到、链接失败、无法生成有效鸿蒙二进制程序等问题。

术语 例子
宿主平台 (Host) 你用来编译的 x86 Windows/Linux 电脑
目标平台 (Target) 代码最终运行的 aarch64 鸿蒙设备(如鸿蒙 PC)

为什么需要特殊配置? rustc 不知道目标设备的系统长什么样,需要额外提供三样东西。OHOS SDK 中包含了后两样:

  • 标准库:目标平台的 Rust 标准库(libstd 等),由 rustup 安装
  • sysroot:目标设备的 libc 和系统头文件,位于 SDK 的 native/sysroot/
  • 链接器:能生成目标机器码的 clang,位于 SDK 的 native/llvm/bin/

一、Windows 完整安装 Rust 教程:

2.1 官方一键安装工具 rustup(推荐):

在 Windows 上搭建 Rust 开发环境分为前置编译依赖准备、官方 rustup 工具安装、国内镜像加速配置、环境校验、配套编辑器配置几个完整流程,全程不需要分段序号,顺着操作即可。

我们可以通过打开官网Rust官网进行下载,选择Windows环境的安装包(X64 RUSTUP-INIT.EXE)。

请添加图片描述

系统检测到你的用户目录里已经存在一份 Rustup 配置文件 C:\Users\admin.rustup\settings.toml,Windows 平台编译 Rust 程序必须依赖微软 Visual C++ 配套的链接器、Windows 系统 API 底层库文件,当前电脑里缺少这套编译依赖组件,所以安装程序弹出选择界面,让你决定如何补齐编译所需环境。

请添加图片描述

这里我们选择第一项,如果只是日常写通用 Rust 工具、Windows 桌面 / 后端程序,优先选第一种自动安装;如果平时用 MinGW 编译、跨 Linux 平台开发,才适合第三种跳过安装。

请添加图片描述

点击"继续"。

请添加图片描述

Rust 在 Windows 上编译程序离不开微软的 C++ 链接工具与 Windows 底层 API 库,选择了全自动补齐这套依赖,所以程序自动拉起 VS 安装包下载流程。全程不需要手动调整组件勾选,安装器会自动匹配 Rust 所需模块,等 VS 相关组件全部装好之后,后台的 rustup 程序才会继续走完 Rust 编译器、Cargo 包管理器等剩余内容的安装步骤。

请添加图片描述

等这个安装器下载完毕后,会自动弹出 VS 的安装选择界面,界面里会预先帮你勾选好 Rust 编译必备的 C++ 生成工具、Windows 系统 SDK 等组件,你只需要确认安装位置并执行安装即可。

请添加图片描述

这个窗口里已经自动帮勾选好了 Rust 编译 Windows 程序缺一不可的两个核心组件,不需要手动增删勾选内容:

请添加图片描述

  • 第一个组件 MSVC v143 生成工具,是微软官方的 C/C++ 链接器与编译工具链,Rust 在 Windows 上生成 exe 可执行文件时,全靠这套工具完成链接、二进制打包工作,没有它就无法编译出 Windows 原生程序。

  • 第二个 Windows 11 SDK 是 Windows 系统底层 API 头文件、系统函数库合集,写窗口程序、调用文件 / 网络 / 硬件等系统原生功能时,Rust 会依赖这套 SDK 读取系统接口定义。

请添加图片描述

等这两项组件全部安装结束后,后台黑色窗口里的 rustup 程序会自动恢复运行,继续完成 Rust 编译器、Cargo 包管理器等剩余主体程序的安装。

请添加图片描述

路径配置说明:

目录名称 作用
Cargo 工作目录 默认存放项目缓存、下载的第三方依赖包的根目录为 C:\Users\admin.cargo,如果后续想要把缓存迁移到其他磁盘,可以通过系统环境变量 CARGO_HOME 修改路径。
命令工具目录 cargo、rustc、rustup 这些编译、包管理命令程序都会放在 C:\Users\admin.cargo\bin,安装程序会自动修改当前用户注册表的 PATH 环境变量,让你在任意终端窗口都能直接调用 Rust 相关命令,不用手动配置环境变量。
卸载回滚机制 后续如果想完整卸载 Rust,执行命令 rustup self uninstall 即可,同时本次安装对系统环境变量、注册表做的修改会全部自动恢复,不会残留配置。

请添加图片描述

默认标准安装方案,直接按下回车键就能执行,全程无需手动调整任何配置,适配绝大多数普通开发者。

请添加图片描述

获取 Rust 官方统一管理工具 rustup,打开浏览器进入 Rust 语言官网的工具下载页面,页面中间会显示适配 Windows 系统的 rustup-init.exe 安装包,点击下载保存到本地任意文件夹,找到刚下载好的 exe 文件直接双击运行,会弹出黑色命令行交互窗口,窗口内会展示三段可选操作说明,默认推荐直接执行完整安装流程,此时不需要输入自定义参数,直接按下键盘回车键确认默认安装方案,程序会自动检测当前系统架构,开始拉取对应版本的 Rust 标准工具链,包含 rustc 编译器、cargo 项目管理工具、标准库文件等核心内容,如果下载速度缓慢可以先关闭当前安装窗口,先配置国内镜像环境变量再重新运行安装程序。


2.2 检查版本:

三条命令全部正常输出版本号,代表你的 Rust 开发环境完整安装成功、环境变量配置生效,系统可以全局识别 rustc、cargo、rustup 三条核心指令。

请添加图片描述

1. rustc --version:

输出:rustc 1.96.0 (ac68faa20 2026-05-25)。
rustc是Rust核心编译器,这条指令用来查看编译器版本。
1.96.0 是当前稳定版编译器版本号,末尾一串字符是源码提交哈希,后面日期为该版本发布时间。

2. cargo --version:

输出:cargo 1.96.0 (30a34c682 2026-05-25)。
cargo是Rust官方项目管理+构建工具,负责新建项目、编译代码、拉取第三方依赖包。
cargo版本号和rustc保持同步,保证工具链配套兼容。

3. rustup --version

输出两行内容:

  1. rustup 1.29.0 (28d1352db 2026-03-05)。
    rustup是Rust工具链管理器,用来安装、切换、卸载不同版本编译器,它本身有独立版本(1.29.0),和rustc编译器版本互不绑定。
  2. 下方两行info提示文字翻译:

这是rustup工具管理器的版本,不是rustc编译器的版本;当前正在启用的rustc编译器版本为1.96.0。
作用是区分管理器本体和编译器,避免混淆两个版本号。


2.3 执行跨平台编译命令:

aarch64-unknown-linux-ohos 是适配鸿蒙 OpenHarmony 系统、ARM64 架构的编译目标,安装这套组件后,你就能在 Windows 电脑上,直接编译出可在鸿蒙 ARM64 设备上运行的二进制程序。

请添加图片描述

rustup target add aarch64-unknown-linux-ohos

请添加图片描述

rustup target add 用于给当前 Rust 工具链新增交叉编译目标平台:

  1. 文件用途:
    原生Windows编译仅自带x86_64-pc-windows-msvc标准库,想要编译鸿蒙/ Linux / macOS等其他系统程序,必须手动下载对应平台的标准库,也就是当前正在拉取的rust-std组件。
  2. 慢下载优化方案:
    当前速度较低,若等待时间过长,可以配置Rust国内镜像源,大幅提升下载速度:
    设置环境变量RUSTUP_DIST_SERVER为国内清华/中科大镜像地址,再重新执行下载指令。
  3. 安装完成后效果:
    下载部署完毕后,你使用cargo build --target aarch64-unknown-linux-ohos,即可一键生成鸿蒙ARM64架构的可执行文件。
  4. 额外依赖提醒:
    仅安装target标准库还不够,交叉编译鸿蒙程序还需要配套的OpenHarmony NDK交叉链接器,否则编译时会报链接器缺失错误。

二、如何安装DevEco Studio:

打开页面后需要登录华为开发者账号才能下载 DevEco Studio,下载完成后安装时会同步拉取鸿蒙 SDK、模拟器等配套开发组件,适配你之前交叉编译鸿蒙 Rust 程序的开发需求。

请添加图片描述

DevEco Studio是华为官方唯一适配 HarmonyOS 的集成开发工具,替代记事本、VS Code 等通用编辑器,完整封装鸿蒙开发全流程,支持 ArkTS、JS、C/C++、Rust 多语言鸿蒙项目开发,刚好匹配你之前配置的 Rust 鸿蒙交叉编译环境。

请添加图片描述

下载安装后会自动拉取对应 HarmonyOS 6.1.1 系统 SDK、编译链、设备模拟器。

请添加图片描述

可以参考我的Windows配置参数。

请添加图片描述

DevEco Studio 安装包体积接近 2.83GB,压缩包内部不只有这个exe安装程序,还捆绑了大量安装资源、依赖文件。Windows 内置压缩工具不支持直接在压缩包内完整读取所有附属文件,如果直接点「运行」,解压过程会不完整,安装时会报文件丢失、安装中断。

请添加图片描述

请添加图片描述

这是 Windows 系统自带压缩工具的提取文件窗口,作用是把 2.83GB 的 DevEco Studio 完整安装包解压到本地磁盘,只有完整解压后,安装程序才能读取全部依赖资源,避免安装报错。

请添加图片描述

请添加图片描述

安装在 C 盘系统盘,IDE、后续下载的鸿蒙 SDK、模拟器镜像会持续占用 C 盘存储空间,长期容易导致 C 盘爆满、系统卡顿,Program Files目录带空格,极少数编译脚本、Rust 交叉编译工具会因路径空格出现解析异常报错,路径不要包含中文、特殊符号、空格,防止 Rust 交叉编译、Hvigor 构建工具出现路径解析错误。

请添加图片描述

  • 勾选后在任意文件夹右键,可直接用 DevEco Studio 打开该目录作为鸿蒙项目,省去 IDE 内手动导入项目的步骤,推荐保留勾选。
  • 勾选后系统环境变量会写入 DevEco 的 bin 工具目录,终端里能直接调用鸿蒙编译、链接、调试命令,和你之前配置的 Rust 工具链互通;页面标注需要重启电脑才能让 PATH 修改完全生效。

请添加图片描述

请添加图片描述

DevEco Studio 本体文件已经复制完成,但之前勾选的PATH 环境变量修改、右键菜单、工具全局调用权限,必须重启电脑才能写入系统并正式生效,不重启会出现命令行找不到鸿蒙编译工具的问题。

请添加图片描述

这个文件夹是 DevEco Studio 安装目录下的 bin 程序根目录,存放 IDE 启动主程序、各类批处理脚本、依赖动态库与辅助工具,安装时勾选将此目录加入系统 PATH 后,终端可以直接调用目录内工具脚本。

后面Rust 鸿蒙交叉编译配置里填写的 NDK 编译链不在当前 bin 目录下,而是在 sdk 子路径的 llvm/bin 文件夹,本目录仅承载 IDE 本体运行相关程序,不包含交叉编译 clang 链接器,整套鸿蒙编译工具是独立存放于 SDK 目录的组件,和 IDE 启动程序分层隔离管理。


三、创建Rust简单项目:

3.2 在Rust项目根目录新建文件夹.cargo:

项目根目录就是 Cargo.toml 同级目录,Windows:在项目文件夹新建文件夹,命名 .cargo(直接输入带点的名字即可),在 .cargo 里新建 config.toml 文件,用记事本、VSCode 等编辑器新建空白文件,保存为 config.toml,放到 .cargo 文件夹内。

请添加图片描述

填写以入的相关参数,Windows 系统模板(DevEco Studio 默认SDK路径):

[target.aarch64-unknown-linux-ohos]

# 链接器:告诉 rustc 用 OHOS 的 clang 进行链接
linker = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\clang.exe"

# 传递给链接器的参数
rustflags = [
    "-C", "link-arg=--sysroot=D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\sysroot",
    "-C", "link-arg=--target=aarch64-linux-ohos",
    "-C", "link-arg=-O2",
]

# 静态库工具:用于打包 .a/.rlib 文件
ar = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\llvm-ar.exe"

# 环境变量:如果项目依赖包含 C/C++ 代码(使用 cc crate),需要告诉它用哪个编译器
[env]
CC_aarch64_unknown_linux_ohos = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\clang.exe"
CXX_aarch64_unknown_linux_ohos = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\clang++.exe"
AR_aarch64_unknown_linux_ohos = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\llvm-ar.exe"
RANLIB_aarch64_unknown_linux_ohos = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\llvm-ranlib.exe"

需要替换您的真实DevEco Studio目录path。

请添加图片描述

Windows路径注意事项,两种写法任选其一,避免转义报错,不要直接粘贴单斜杠 D:\xxx,toml会解析出错:

    1. 双反斜杠(模板里用的):D:\DevEco\xxx\openharmony
    1. 正斜杠:D:/DevEco/DevEco Studio/sdk/default/openharmony

3.3 目录结构:

Rust项目目录结构最终如下:

项目文件夹/
├─ Cargo.toml
├─ src/
│  └─ main.rs
└─ .cargo/
   └─ config.toml  # 配置文件放这里

main.rs文件内容:

use rand::Rng;

fn main() {
    let secret_number = rand::thread_rng().gen_range(1..101);
    println!("Generated a secret number: {}", secret_number);
}

Cargo.toml文件内容:

[package]
name = "ohos-demo"
version = "0.1.0"
edition = "2021"

[dependencies]
rand = "0.8"

3.4 交叉编译打包ohos代码:

安装ohos编译目标:

rustup target add aarch64-unknown-linux-ohos

执行交叉编译命令测试:

cargo build --target aarch64-unknown-linux-ohos

请添加图片描述

  • cargo:Rust项目构建&包管理工具,用来创建项目、编译、拉取第三方库
  • build:子命令,执行完整编译流程(源码检查→编译→链接,生成可执行二进制文件)
  • --target xxx:指定编译输出目标平台,不写该参数时默认编译当前Windows电脑程序,加上后强制输出鸿蒙ARM64架构程序

完整执行流程(Windows交叉编译鸿蒙):

  1. Cargo读取项目Cargo.toml配置,调用rustc编译器;
  2. rustc调用你第一步下载的aarch64-unknown-linux-ohos标准库,把.rs源码编译为鸿蒙架构的中间目标文件;
  3. 关键步骤:链接阶段
    rustc自身不带鸿蒙系统链接器,会去系统PATH寻找DevEco Studio提供的aarch64-linux-ohos-ld交叉链接器,把Rust编译产物 + 鸿蒙系统API库、系统运行依赖合并成单一可执行文件;
  4. 编译产物输出路径:项目目录/target/aarch64-unknown-linux-ohos/debug/,里面的无后缀二进制文件就是能放到鸿蒙设备运行的程序。

请添加图片描述

用file命令校验交叉编译产出文件的执行界面,当前工作目录处于D盘rust项目根路径,执行命令读取release目录下ohos-demo二进制文件的格式信息,返回结果确认文件为64位ELF可执行程序,架构是ARM aarch64,适配鸿蒙内核运行标准,属于动态链接程序且未剥离调试符号,完整印证此前整套Windows交叉编译流程输出的产物完全符合鸿蒙ARM64设备可识别的程序格式,从侧面说明rustup目标、DevEco NDK clang链接器、Cargo编译配置全部协同生效,生成的二进制文件可以直接传输至鸿蒙开发板或模拟器执行。

请添加图片描述

将交叉编译流程输出的产物拷贝到鸿蒙PC上面。

请添加图片描述

鸿蒙设备内置 HiShell 终端完整的程序签名与运行流程,刚把 Windows 交叉编译好的 Rust 二进制文件传到设备目录,直接执行文件会弹出权限拒绝提示,前期不带横杠的 selfSign 参数写法不符合签名工具语法规范,连续两次签名指令执行失败,修正参数格式补充前置横杠后,代码段签名流程顺利完成并写入签名数据。

localhost ~ % binary-sign-tool sign -inFile ./ohos-demo -outFile ./ohos-demo-test -selfSign "1"
06-21 02:09:11.024 INFO  - write code sign data success

鸿蒙原生二进制程序自签名命令,通过 binary-sign-tool 工具对编译产出的 ohos-demo 文件执行签名操作,指定输入文件路径与签名后输出文件名称,开启 - selfSign 自签名模式完成程序合法性标记,日志输出代表签名数据成功写入二进制文件,签名完成后的程序才能在鸿蒙设备正常运行,未签名程序即便赋予可执行权限也会运行拦截,签名操作是交叉编译后真机运行前必不可少的步骤。

localhost ~ % chmod +x ./ohos-demo-test
localhost ~ % ./ohos-demo-test
Generated a secret number: 74

给签名完成的二进制程序赋予可执行权限,刚完成签名的文件默认没有运行权限,直接调用会提示权限拒绝,添加执行权限后就能正常启动程序,紧随其后直接运行目标程序,终端输出打印出代码内生成的随机数字,代表此前 Windows 交叉编译、鸿蒙端签名、授权运行整套流程全部正常通,Rust 编写的逻辑在鸿蒙设备上成功执行。


四、如何安装CodeArts来调用第三方库呢?

4.1 安装CodeArts IDE:

华为云 CodeArts 开发工具套件,是华为自研的本地桌面 IDE 工具,和你之前安装的 DevEco Studio 同属华为开发工具生态,但定位完全不同。

请添加图片描述

面向 Python 的专用开发环境,提供了强大的代码辅助功能,索引速度更快,符号跳转更精确;包括快速和智能的代码补全、深度集成华为云计算公司的服务能力,但是针对Rust的代码也可以编辑。

请添加图片描述

页面点击「下载使用」,获取 Windows 64 位离线压缩安装包,下载完成后不要直接在压缩包内双击 exe,点击「全部解压缩」,解压路径全程使用纯英文,禁止中文、空格、特殊符号。

请添加图片描述

确认磁盘空间:单语言 IDE 本体占用约 2~3GB,预留至少 5GB 空闲空间,优先选择 D 盘等非系统盘存放,系统权限:使用管理员权限运行安装包,避免读写权限不足导致组件安装失败。

请添加图片描述

这个界面是 CodeArts IDE Python 安装流程里的附加功能配置页,当前全部选项都处于勾选状态,这套完整勾选配置适合兼顾终端命令调用、文件快速打开、项目便捷导入的完整开发场景:

  • 桌面快捷方式可以省去每次查找安装目录启动软件的步骤;
  • 两类右键菜单分别支持右键直接打开单个代码文件、把整个文件夹作为完整工程载入编辑器,日常导入项目会更高效;
  • 文件类型注册后,双击 Python 相关后缀文件会默认用这款 IDE 打开,不用手动选择打开程序;
  • PATH 环境变量写入是跨终端、跨工具联调的核心配置,修改需要重启电脑才能生效,能让命令行直接调用 IDE 自带的 Python 编译调试工具,和之前搭建的 Rust、鸿蒙交叉编译环境配合使用时不会出现命令找不到的问题。

请添加图片描述

完成软件本体安装,PATH 环境变量、右键菜单这类系统层面的修改需要重启电脑才能完全生效,重启之后终端才能正常识别 IDE 内置的 Python 相关命令,和你之前搭建的 Rust、鸿蒙交叉编译环境实现命令行互通调用。

请添加图片描述

请添加图片描述

请添加图片描述

这是 CodeArts IDE for Python 初次打开后的欢迎首页,软件本身已经完整加载完毕,但华为这套 IDE 有账号校验机制,弹窗提示必须登录华为云账号才能解锁完整编辑、调试、工程创建全部功能,不登录会限制绝大多数开发操作。


4.3 CodeArts IDE完成一个Rust三方库的调用:

在 CodeArts IDE 里打开了用于鸿蒙交叉编译的 Rust 项目,主编辑区打开了项目配置文件 Cargo.toml,里面声明了项目名称、版本、Rust 标准版本,同时引入了随机数、UUID 生成两个第三方依赖库。

[package]
name = "ohos-demo"
version = "0.1.0"
edition = "2021"

[dependencies]
rand = "0.8"
# UUID库,随机生成id
uuid = { version = "1.6", features = ["v4"] }

请添加图片描述

Rust 项目自动生成的 Cargo.lock 锁定文件,文件开头注释明确说明该文件由 Cargo 工具自动维护,不建议手动修改编辑,文件内部完整记录项目所有直接、间接依赖库的精准版本、源码仓库地址与校验哈希值,以此保证不同设备拉取代码后依赖版本完全统一,避免第三方库版本差异带来的编译异常。

# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4

[[package]]
name = "bumpalo"
version = "3.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"

[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"

[[package]]
name = "futures-core"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"

[[package]]
name = "futures-task"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"

[[package]]
name = "futures-util"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
dependencies = [
 "futures-core",
 "futures-task",
 "pin-project-lite",
 "slab",
]

[[package]]
name = "getrandom"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
dependencies = [
 "cfg-if",
 "libc",
 "wasi",
]

[[package]]
name = "getrandom"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
dependencies = [
 "cfg-if",
 "libc",
 "r-efi",
]

[[package]]
name = "js-sys"
version = "0.3.102"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"
dependencies = [
 "cfg-if",
 "futures-util",
 "wasm-bindgen",
]

[[package]]
name = "libc"
version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"

[[package]]
name = "ohos-demo"
version = "0.1.0"
dependencies = [
 "rand",
 "uuid",
]

[[package]]
name = "once_cell"
version = "1.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"

[[package]]
name = "pin-project-lite"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"

[[package]]
name = "ppv-lite86"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [
 "zerocopy",
]

[[package]]
name = "proc-macro2"
version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
 "unicode-ident",
]

[[package]]
name = "quote"
version = "1.0.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
dependencies = [
 "proc-macro2",
]

[[package]]
name = "r-efi"
version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"

[[package]]
name = "rand"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a"
dependencies = [
 "libc",
 "rand_chacha",
 "rand_core",
]

[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
 "ppv-lite86",
 "rand_core",
]

[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
 "getrandom 0.2.17",
]

[[package]]
name = "rustversion"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"

[[package]]
name = "slab"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"

[[package]]
name = "syn"
version = "2.0.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
dependencies = [
 "proc-macro2",
 "quote",
 "unicode-ident",
]

[[package]]
name = "unicode-ident"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"

[[package]]
name = "uuid"
version = "1.23.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7"
dependencies = [
 "getrandom 0.4.3",
 "js-sys",
 "wasm-bindgen",
]

[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"

[[package]]
name = "wasm-bindgen"
version = "0.2.125"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"
dependencies = [
 "cfg-if",
 "once_cell",
 "rustversion",
 "wasm-bindgen-macro",
 "wasm-bindgen-shared",
]

[[package]]
name = "wasm-bindgen-macro"
version = "0.2.125"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"
dependencies = [
 "quote",
 "wasm-bindgen-macro-support",
]

[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.125"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"
dependencies = [
 "bumpalo",
 "proc-macro2",
 "quote",
 "syn",
 "wasm-bindgen-shared",
]

[[package]]
name = "wasm-bindgen-shared"
version = "0.2.125"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"
dependencies = [
 "unicode-ident",
]

[[package]]
name = "zerocopy"
version = "0.8.52"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"
dependencies = [
 "zerocopy-derive",
]

[[package]]
name = "zerocopy-derive"
version = "0.8.52"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
]

请添加图片描述

当前打开的是 Rust 项目入口源码 main.rs,代码引入 uuid 库用于生成 v4 版本随机唯一标识,主函数内先创建 UUID 实例并打印输出,再将 UUID 转为字符串存入变量 s 并再次打印,终端提示的警告仅因为变量 s 后续没有被继续使用,不会中断编译流程,也不会影响最终鸿蒙架构二进制文件生成。

use uuid::Uuid;

fn main() {
    // 生成随机UUID v4
    let id = Uuid::new_v4();
    println!("{}", id);
    // 转字符串
    let s = id.to_string();
    println!("{}", s);
}

请添加图片描述

这份.cargo/config.toml 是 Rust 交叉编译鸿蒙的核心配置文件,里面完整写明 aarch64-unknown-linux-ohos 目标对应的全套编译工具路径,全部指向你本地 DevEco Studio 内置的 OpenHarmony NDK 工具链,指定 clang 作为链接器、配套 sysroot 系统库根目录、交叉编译目标标识,同时配置静态库打包工具与 C/C++ 交叉编译器环境变量,让 cargo 编译时自动调用鸿蒙专用链接工具,不用每次编译手动传入冗长命令参数。

[target.aarch64-unknown-linux-ohos]

# 链接器:告诉 rustc 用 OHOS 的 clang 进行链接
linker = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\clang.exe"

# 传递给链接器的参数
rustflags = [
    "-C", "link-arg=--sysroot=D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\sysroot",
    "-C", "link-arg=--target=aarch64-linux-ohos",
    "-C", "link-arg=-O2",
]

# 静态库工具:用于打包 .a/.rlib 文件
ar = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\llvm-ar.exe"

# 环境变量:如果项目依赖包含 C/C++ 代码(使用 cc crate),需要告诉它用哪个编译器
[env]
CC_aarch64_unknown_linux_ohos = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\clang.exe"
CXX_aarch64_unknown_linux_ohos = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\clang++.exe"
AR_aarch64_unknown_linux_ohos = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\llvm-ar.exe"
RANLIB_aarch64_unknown_linux_ohos = "D:\\Program Files\\Huawei\\DevEco Studio\\sdk\\default\\openharmony\\native\\llvm\\bin\\llvm-ranlib.exe"

请添加图片描述

底部终端完整留存两次针对 aarch64-unknown-linux-ohos 目标的编译记录,调试版与发布版编译全部顺利完成,代表 Windows 本地的 Rust 工具链、鸿蒙交叉链接器、IDE 环境变量配置全部协同生效,可直接在这款 CodeArts 内置终端完成代码修改、跨平台编译全流程操作,整套交叉编译流程无链接器、标准库缺失类报错,印证 rustup 目标、DevEco 交叉编译工具链、系统 PATH 环境变量的配置全部生效,CodeArts 内置终端可直接执行 cargo 编译指令,在同一编辑器内完成代码查看、依赖核对、跨平台编译全流程操作。

请添加图片描述

绿色框标注的 target 目录是 Rust 编译产物存放根目录,内部按交叉编译目标三元组划分独立文件夹,当前 aarch64-unknown-linux-ohos 文件夹专门存储鸿蒙 ARM64 架构的编译输出,debug 子目录对应调试编译模式,里面存放带完整调试符号、未做性能精简的程序文件,箭头指向的 ohos-demo 就是可直接放到鸿蒙设备运行的原生二进制可执行文件,其余子文件夹分别存放依赖库缓存、增量编译中间文件、示例程序编译产物等辅助缓存资源。


五、鸿蒙PC上验证打包Rust程序:

请添加图片描述

再次将交叉编译的二进制文件拷贝到鸿蒙PC中。

请添加图片描述

再次重复对原文件签名并沿用旧输出文件名时出现写入签名段失败报错,系统无法覆盖已存在的签名文件,执行授权命令时也提示文件不存在,于是调整输出文件名生成全新的 ohos-demo-test1,签名流程顺利完成,添加可执行权限后运行程序,终端打印出 uuid 格式字符串,代表引入的 uuid 第三方库逻辑在鸿蒙设备正常生效,两次运行分别验证了随机数、唯一 ID 两套代码逻辑,交叉编译、设备签名、真机执行的完整链路都验证稳定可用。


总结:

整套流程分为Windows开发环境部署、项目工程搭建、CodeArts IDE开发编译、鸿蒙设备签名运行四大阶段,全程打通Windows编写代码、跨架构编译、鸿蒙真机执行的完整闭环。

1. Windows开发环境部署

先通过rustup安装完整Rust工具链,安装时自动补齐MSVC编译工具与Windows SDK,配置系统PATH实现全局调用rustc、cargo、rustup指令,通过三条版本校验命令确认环境可用;执行rustup target命令下载鸿蒙aarch64架构标准库,完成交叉编译底层依赖准备。
下载并完整解压DevEco Studio,选择非系统纯英文路径安装,勾选添加至系统PATH后重启电脑生效,工具内置的OpenHarmony NDK提供clang交叉链接器、系统sysroot库、llvm打包工具,是Rust交叉编译鸿蒙程序的核心依赖,IDE本体仅作鸿蒙应用工程开发,交叉编译链独立存放于SDK的llvm目录。

2. Rust鸿蒙项目工程搭建

新建标准Cargo项目,在项目根目录创建.cargo文件夹与config.toml配置文件,填入本机DevEco NDK全套工具路径,明确指定鸿蒙专用链接器、编译参数、C/C++交叉编译环境变量,规避路径空格、转义字符解析报错;编辑Cargo.toml声明项目信息,按需引入rand、uuid等第三方依赖库,编写main.rs实现随机数、UUID生成的测试逻辑。
执行cargo build指定鸿蒙架构目标完成交叉编译,target目录下产出ARM64架构ELF二进制文件,使用file命令校验文件架构格式,确认产物适配鸿蒙内核运行标准。

3. CodeArts IDE开发与编译适配

安装CodeArts IDE for Python,完整勾选桌面快捷方式、文件右键菜单、PATH环境变量等附加任务,重启电脑后系统终端与IDE内置终端可互通调用Rust、鸿蒙编译指令;IDE登录华为云账号后解锁完整代码编辑、终端调试能力,可直接打开Rust项目,内置终端一键执行交叉编译命令,自动读取Cargo.lock锁定全部依赖版本,保证多设备依赖一致性,无需切换外部终端即可完成代码修改、依赖拉取、跨平台编译全流程操作。

4. 鸿蒙设备签名与程序运行

将Windows编译完成的二进制文件传输至鸿蒙HiShell终端,未签名文件无法直接运行,使用binary-sign-tool执行自签名操作,参数需补充前置横杠避免语法报错,重复签名时更换输出文件名防止覆盖写入失败;签名完成后通过chmod赋予文件可执行权限,运行程序后终端正常打印代码逻辑输出,验证第三方库可在鸿蒙设备正常调用,整套Windows交叉编译、设备签名、真机运行链路验证稳定可用。

Windows编译鸿蒙程序不能仅安装Rust标准库,必须配套DevEco Studio的NDK交叉链接工具链;所有工具、项目路径禁止中文、空格、特殊符号,防止编译脚本解析异常;PATH环境变量、系统级配置修改完成后必须重启电脑才能完整生效;鸿蒙原生二进制文件强制要求自签名,未签名或权限不足都会拦截运行;CodeArts IDE可兼容Rust代码开发,和DevEco、Rust工具链环境互通,实现一体化开发调试。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐