
使用 Rust 编写原生库 —— 比 C++ 更具优势
近年来,Rust 以其卓越的性能和安全性,逐渐成为替代 C++ 的新兴编程语言。尤其是在编写高效、可靠的原生库方面,Rust 展现出了更为强大的竞争力。在本教程中,我们将基于华为开源操作系统 OpenHarmony(OHOS),探索如何利用 Rust 构建高性能原生库,并逐步配置相关环境,使其适用于 OpenHarmony 系统。
快速开始
为了充分利用 Rust 开发原生库的优势,我们首先需要确保 Rust 的版本处于最新状态,并且具备对 OHOS 支持的架构。本文将带你逐步配置 Rust 开发环境,为开发 OpenHarmony 原生库做好准备。
1. 切换至 nightly 版本
-
安装
nightly版本的 Rust:rustup install nightly -
切换到
nightly版本:rustup default nightly -
确认安装是否成功:
rustc --version # 若输出类似以下内容,则说明安装成功: # rustc 1.80.0-nightly (faefc618c 2024-05-07)
2. 添加 rust-src 组件
确保安装 rust-src 组件。如果提示 Not Found,请执行 rustup update 进行更新:
rustup component add rust-src
3. 添加 OHOS 支持的架构
-
使用以下命令检查当前 Rust 默认使用的版本:
rustup show # 输出示例: # nightly-x86_64-apple-darwin (default) -
查询支持的架构:
rustc --print target-list | grep ohos # 应该输出以下内容,若没有则需更新 Rust: # aarch64-unknown-linux-ohos # armv7-unknown-linux-ohos # x86_64-unknown-linux-ohos -
添加架构支持:
rustup target add aarch64-unknown-linux-ohos rustup target add armv7-unknown-linux-ohos rustup target add x86_64-unknown-linux-ohos
4. 配置 OHOS openssl-sys
- 添加环境变量至
~/.zshrc或相应的 Shell 配置文件中:
export AARCH64_UNKNOWN_LINUX_OHOS_OPENSSL_DIR=~/Library/Huawei/ohos-openssl/prelude/arm64-v8a/
export ARMV7_UNKNOWN_LINUX_OHOS_OPENSSL_DIR=~/Library/Huawei/ohos-openssl/prelude/armeabi-v7a/
export X86_64_UNKNOWN_LINUX_OHOS_OPENSSL_DIR=~/Library/Huawei/ohos-openssl/prelude/x86_64/
export AARCH64_UNKNOWN_LINUX_OHOS_OPENSSL_NO_VENDOR=1
export ARMV7_UNKNOWN_LINUX_OHOS_OPENSSL_NO_VENDOR=1
export X86_64_UNKNOWN_LINUX_OHOS_OPENSSL_NO_VENDOR=1
- 注意
NO_VENDOR=1目前鸿蒙暂不支持vendored,Cargo.toml文件中不要添加features
[dependencies.openssl]
version = "=0.10.57"
# features = ["vendored"]
至此,我们已经完成了 Rust 环境的设置。接下来,你可以开始使用 Rust 构建 OpenHarmony 支持的原生库,在接下来的篇章中,我们将深入探讨如何利用 Rust 打造更为高效、安全的原生库。
撰写不易,请给个赞👍吧
补充(24/09/27)
纯血鸿蒙使用 openssl-111
项目不支持3.x可以使用111版本进行替代
git 执行命令直接添加补丁 patchs/openssl.patch,如果执行不成功可以手动添加
diff --git a/Configurations/10-main.conf b/Configurations/10-main.conf
index cba57b4127..5257f89755 100644
--- a/Configurations/10-main.conf
+++ b/Configurations/10-main.conf
@@ -907,7 +907,21 @@ my %targets = (
perlasm_scheme => "elf32",
multilib => "x32",
},
-
+ "ohos-aarch64" => {
+ inherit_from => [ "linux-aarch64" ],
+ shared_extension => ".so"
+ },
+ "ohos-arm" => {
+ inherit_from => [ "linux-generic32" ],
+ asm_arch => 'armv4',
+ perlasm_scheme => "linux32",
+ ex_libs => add(threads("-lclang_rt.builtins")),
+ shared_extension => ".so"
+ },
+ "ohos-x86_64" => {
+ inherit_from => [ "linux-x86_64" ],
+ shared_extension => ".so"
+ },
"linux-ia64" => {
inherit_from => [ "linux-generic64" ],
bn_ops => "SIXTY_FOUR_BIT_LONG",