zoxide 开源鸿蒙 PC 生态适配实战:Rust 交叉编译与 HNP 打包完整指南

zoxide 开源鸿蒙 PC 生态适配实战:Rust 交叉编译与 HNP 打包完整指南

前言:为什么要把 zoxide 引入开源鸿蒙 PC 生态?

作为 Linux 终端下广受欢迎的智能目录跳转工具,zoxide 凭借关键词模糊匹配 + 访问频率排序的核心优势,彻底解决了传统 cd 命令需记忆冗长路径、逐级跳转的痛点,成为开发者与运维人员提升终端效率的必备工具。随着开源鸿蒙 OpenHarmony PC 生态的快速发展,终端命令行工具的丰富度成为提升用户体验的关键环节。为让开源鸿蒙 PC 用户也能享受到 zoxide 的高效便捷。

本文基于 Rust 交叉编译技术与开源鸿蒙 HNP 规范,详细拆解 zoxide 从源码拉取、构建脚本配置、交叉编译打包,到设备端安装验证的完整适配流程。文中不仅提供可直接复用的配置文件与命令代码,还汇总了适配过程中常见的 Rust 编译、链接器兼容等问题及解决方案,为开发者提供一套低成本、高可复用的开源鸿蒙 PC 命令行工具适配参考方案。

Linux 场景下 zoxide 的核心价值与典型使用方式

zoxide 作为 Linux 终端下 cd 命令的高效替代工具,核心价值在于通过智能索引目录访问记录、按频率排序及关键词模糊匹配,让目录跳转无需记忆完整路径 —— 日常开发中可通过 z 项目关键词 快速切换多项目目录,运维场景下能精准匹配开发 / 测试 / 生产等多环境深层目录,配合 z add 手动标记重要路径、z clean 清理无效记录、z -i 结合 fzf 交互式搜索等功能,大幅减少冗长路径输入和逐级跳转操作,无论是频繁切换工作目录、访问深层嵌套路径,还是管理多类环境目录,都能显著提升终端操作效率,成为开发者和运维人员的必备终端工具。

zoxide 在 OpenHarmony PC 的适配总体思路

环境准备:适配前必须完成的工具链与 SDK 配置

Linux 进行鸿蒙 OpenHarmony适配的核心前提准备包括:

  • 配置 Linux 环境(如 Ubuntu 22.04)并更换国内镜像源
  • 安装 Python3 及依赖工具
  • 下载并解压 OpenHarmony SDK 含 native、toolchains 组件
  • 准备构建脚手架及目标部件的源码
  • 完成鸿蒙化适配,如添加构建脚本、配置文件,修改源码兼容性

下方汇总展示了多位老师在鸿蒙 OpenHarmony 适配方面的高质量教程,如果在前提准备部分还有不清楚的地方,可参考这些文章进行进一步学习,以下资源不分先后顺序,均具有参考价值!

资源类型描述链接
基础环境搭建Windows 10 上安装和使用 WSL 2 安装 Ubuntu24详细指南👉点击查看
Mac移植指南HarmonyOS PC 命令行适配指南(Mac 版)👉点击查看
Win移植指南鸿蒙PC生态三方软件移植:开发环境搭建及三方库移植指南👉点击查看
全流程适配指南OpenHarmony Linux 命令行工具适配实战:基于 Cursor × WSL 的 tree 2.2.1 交叉编译与 HNP 打包全流程指南👉点击查看
官方构建文档社区维护的鸿蒙 PC 生态命令行工具构建脚手架👉点击查看

基于 Cursor 的鸿蒙适配全流程总览

拉取源码:获取 zoxide 适配所需的完整代码基线

进入 code 目录,从 GitCode 克隆 zoxide 源码,为鸿蒙适配准备源码基础

# 进入build目录下的code子目录
cd code

# 从GitCode仓库克隆tre工具的源码到当前目录,创建名为tre的文件夹
git clone https://gitcode.com/GitHub_Trending/zo/zoxide.git

在这里插入图片描述

配置 dependency.json:声明源码依赖及代码拉取方式

配置 dependency.json 依赖配置文件(配置 zoxide 源码依赖,指定仓库地址、分支,供构建脚本自动拉取适配)

{
     "dependency": [
           {
               "name": "zoxide",
               "branch": "master",
               "url": "git@gitcode.com:weixin_62765017/zoxide.git"
           }
     ]
}

在这里插入图片描述

配置 build.sh:设置鸿蒙 SDK、交叉编译工具链与构建入口

修改 build.sh 指定鸿蒙 SDK 路径,适配不同构建环境(OpenHarmony/HarmonyOS/Linux 等),配置编译器、系统根目录等构建依赖,检查 Python 环境,最终按配置拉取依赖或执行 zoxide 的鸿蒙适配构建脚本

#!/bin/bash

SDK_PATH=""
while [[ $# -gt 0 ]]; do
    case "$1" in
        --sdk)
            SDK_PATH="$2"
            shift 2
            ;;
        *)
            echo "Error: unknow param $1"
            echo "Usage: $0 --sdk <SDK path>"
            exit 1
            ;;
    esac
done

if [ -z "$SDK_PATH" ]; then
    echo "Error: SDK path must be specified with the \"--sdk\" option"
    echo "Usage: $0 --sdk <SDK path>"
    exit 1
fi

if [ ! -d "$SDK_PATH" ]; then
    echo "Error: SDK path is not exist or no permossion: [$SDK_PATH]"
    exit 2
fi

export OHOS_SDK="$SDK_PATH"
export HNP_PERFIX=

BUILD_OS=$(uname)
case $BUILD_OS in
    'OpenHarmony')
        echo "Build in: <$(uname -a)> by local tool chains."
        export COMPILER_TOOLCHAIN=${OHOS_TOOL_CHAIN_PATH}
    ;;
    'HarmonyOS')
        echo "Build in: <$(uname -a)> by local tool chains."
        export COMPILER_TOOLCHAIN=${HMOS_TOOL_CHAIN_PATH}
        export HNP_PERFIX=${PWD}/hnp
    ;;
    *)
        echo "Build in: <$(uname -a)> by cross tool chains."
        export COMPILER_TOOLCHAIN=${OHOS_SDK}/native/llvm/bin/
    ;;
esac

if [ -z "${HNP_PERFIX}" ]; then
    export HNP_PERFIX="${PWD}/hnp"
fi

if [ -n "${HNP_PERFIX}" ]; then
    mkdir -p "${HNP_PERFIX}"
fi

PYTHON=$(python --version)
echo "python  : $PYTHON"
if [ -z "$PYTHON" ]; then
    echo "You need install python in your system"
    case "$BUILD_OS" in
        OpenHarmony|HarmonyOS)
            echo "${BUILD_OS} install by url://www.xxx.xxx.com"
            ;;
        Linux* )
            if command -v apt-get &> /dev/null; then
                echo "1. sudo apt update"
                echo "2. sudo apt install python3 python3-pip"
            elif command -v yum &> /dev/null; then
                echo "1. sudo yum install python3 python3-pip"
            else
                echo "Please install python3 and pip using your system's package manager."
            fi
            ;;
        Darwin*)
            echo "1. Use Homebrew: brew install python"
            echo "or"
            echo "2. Download by python org: https://www.python.org/downloads/macos/"
            ;;
        CYGWIN*|MINGW32*|MSYS*|MINGW*)
            echo "1. Download by python org: https://www.python.org/downloads/windows/"
            echo "2. Check the \"Add Python to PATH\" option during installation."
            ;;
        *)
            echo "Unable to determine the appropriate Python installation method for your system."
            ;;
    esac
    exit 1
fi

export CC=${COMPILER_TOOLCHAIN}clang             && echo "CC      : ${CC}"
export CXX=${COMPILER_TOOLCHAIN}clang++          && echo "CXX     : ${CXX}"
export HOSTCC=${CC}                              && echo "HOSTCC  : ${HOSTCC}"
export HOSTCXX=${CXX}                            && echo "HOSTCXX : ${HOSTCXX}"
export CPP=${CXX}                                && echo "CPP     : ${CPP}"
export AS=${COMPILER_TOOLCHAIN}llvm-as           && echo "AS      : ${AS}"
export LD=${COMPILER_TOOLCHAIN}ld.lld            && echo "LD      : ${LD}"
export STRIP=${COMPILER_TOOLCHAIN}llvm-strip     && echo "STRIP   : ${STRIP}"
export RANLIB=${COMPILER_TOOLCHAIN}llvm-ranlib   && echo "RANLIB  : ${RANLIB}"  
export OBJDUMP=${COMPILER_TOOLCHAIN}llvm-objdump && echo "OBJDUMP : ${OBJDUMP}"
export OBJCOPY=${COMPILER_TOOLCHAIN}llvm-objcopy && echo "OBJCOPY : ${OBJCOPY}"
export NM=${COMPILER_TOOLCHAIN}llvm-nm           && echo "NM      : ${NM}"
export AR=${COMPILER_TOOLCHAIN}llvm-ar           && echo "AR      : ${AR}"

export SYSROOT=${OHOS_SDK}/native/sysroot
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}/usr/lib/aarch64-linux-ohos
export PKG_CONFIG_PATH=${PKG_CONFIG_SYSROOT_DIR}
export PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_SYSROOT_DIR}

export HNP_TOOL=${OHOS_SDK}/toolchains/hnpcli
export CMAKE=${OHOS_SDK}/native/build-tools/cmake/bin/cmake
export TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake

export WORK_ROOT=${PWD}
export ARCHIVE_PATH=${WORK_ROOT}/output
export COMM_DEP_PATH=${WORK_ROOT}/deps_install

export HNP_PUBLIC_PATH=${HNP_PERFIX}/data/service/hnp/
export MAKE_QUITE_PARAM=" -s "
export CONFIGURE_QUITE_PARAM=" --quiet "

export TARGET_PLATFORM=aarch64-linux-ohos

export CFLAGS="-fPIC -D__MUSL__=1 -D__OHOS__ -fstack-protector-strong --target=${TARGET_PLATFORM} -fuse-ld=${LD} --sysroot=${SYSROOT}"
export CXXFLAGS="${CFLAGS} "
export LD_LIBRARY_PATH=${SYSROOT}/usr/lib:${LD_LIBRARY_PATH}
export LDFLAGS="${LDFLAGS} -fuse-ld=${LD} --target=${TARGET_PLATFORM} --sysroot=${SYSROOT}"
export HOST_TYPE="--host=aarch64-linux --build=aarch64-linux"

mkdir -p ${HNP_PUBLIC_PATH}
mkdir -p ${ARCHIVE_PATH}

mkdir -p code

BUILD_BY_DEPENDENCY="true"
# 需要构建的组件名称
SPECIFIC_DIR="zoxide"

if [[ "${BUILD_BY_DEPENDENCY}" == "true" ]]; then
    python build_dependency.py
else
    pushd code/${SPECIFIC_DIR}
       chmod +x build_ohos.sh && source build_ohos.sh
    popd
fi

在这里插入图片描述

配置 hnp.json:定义鸿蒙原生包(HNP)的基本元数据

hnp.json 鸿蒙原生包配置,定义鸿蒙原生包 HNP 配置,指定包名 zoxide、版本 1.0.0,为后续打包安装提供基础配置

{
    "type":"hnp-config",
    "name":"zoxide",
    "version":"1.0.0",
    "install":{}
}

在这里插入图片描述

编写 build_ohos.sh:Rust 交叉编译、产物整理与 HNP 打包脚本

build_ohos.sh 构建与打包脚本,配置 Rust 交叉编译环境(自动适配 / 回退目标架构、设置链接器与编译参数),通过 Cargo 构建 zoxide Release 版本,整理二进制文件、文档、补全脚本及 HNP 配置文件,最终打包为鸿蒙可安装的 HNP 包与压缩包

#!/bin/bash
set -euo pipefail

# 清理外部注入的 RUSTFLAGS,避免遗留参数影响交叉链接
unset RUSTFLAGS

export TREE_INSTALL_HNP_PATH="${HNP_PUBLIC_PATH}/zoxide.org/zoxide_1.0.0"

sys_prefix=${PREFIX-}
export PREFIX="${TREE_INSTALL_HNP_PATH}"
echo "${PREFIX}"

TARGET_TRIPLE="${TARGET_PLATFORM:-aarch64-linux-ohos}"
FALLBACK_TRIPLE="aarch64-unknown-linux-musl"
CARGO_BIN=${CARGO:-cargo}
RUSTUP_LLD_BIN=${RUSTUP_RUST_LLD:-"$HOME/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin/rust-lld"}

export CARGO_REGISTRIES_CRATES_IO_PROTOCOL="sparse"
export CARGO_REGISTRIES_CRATES_IO_INDEX="${CARGO_REGISTRIES_CRATES_IO_INDEX:-https://mirrors.ustc.edu.cn/crates.io-index/}"

ensure_rust_target() {
    local target="$1"
    if ! rustc --print target-list | grep -q "^${target}\$"; then
        return 1
    fi
    if ! rustup target list --installed | grep -q "^${target}\$"; then
        echo "Info: 自动安装 Rust 目标 ${target}"
        rustup target add "${target}"
    fi
    return 0
}

if ! ensure_rust_target "${TARGET_TRIPLE}"; then
    if ensure_rust_target "${FALLBACK_TRIPLE}"; then
        echo "Warn: 当前 Rust 不支持 ${TARGET_TRIPLE},自动回退到 ${FALLBACK_TRIPLE}"
        TARGET_TRIPLE="${FALLBACK_TRIPLE}"
    else
        echo "Error: rustc 无法使用 ${TARGET_TRIPLE} 或回退目标 ${FALLBACK_TRIPLE}"
        exit 4
    fi
fi

SYSROOT_PATH="${SYSROOT:-${OHOS_SDK}/native/sysroot}"
USE_SYSROOT_FLAG="true"
TRIPLE_ENV=$(echo "${TARGET_TRIPLE}" | tr '[:lower:]-' '[:upper:]_')
OHOS_CRT_DIR="${SYSROOT_PATH}/usr/lib/aarch64-linux-ohos"

PREFERRED_LINKER="${COMPILER_TOOLCHAIN}aarch64-linux-ohos-clang"
if [[ "${TARGET_TRIPLE}" == *"linux-musl"* ]]; then
    if [[ -x "${RUSTUP_LLD_BIN}" ]]; then
        PREFERRED_LINKER="${RUSTUP_LLD_BIN}"
    else
        PREFERRED_LINKER="rust-lld"
    fi
    USE_SYSROOT_FLAG="false"
fi

if [[ "${TARGET_TRIPLE}" == *"ohos"* ]]; then
    missing_crt=false
    for crt in Scrt1.o crti.o crtbeginS.o crtendS.o crtn.o; do
        if [ ! -f "${OHOS_CRT_DIR}/${crt}" ]; then
            missing_crt=true
            break
        fi
    done

    if ${missing_crt}; then
        echo "Warn: OHOS sysroot 缺少必要 CRT 文件,回退到 ${FALLBACK_TRIPLE}"
        TARGET_TRIPLE="${FALLBACK_TRIPLE}"
        TRIPLE_ENV=$(echo "${TARGET_TRIPLE}" | tr '[:lower:]-' '[:upper:]_')
        USE_SYSROOT_FLAG="false"
        if [[ -x "${RUSTUP_LLD_BIN}" ]]; then
            PREFERRED_LINKER="${RUSTUP_LLD_BIN}"
        else
            PREFERRED_LINKER="rust-lld"
        fi
    fi
fi

if [ "${PREFERRED_LINKER}" != "rust-lld" ] && [ ! -x "${PREFERRED_LINKER}" ]; then
    echo "Warn: ${PREFERRED_LINKER} 不存在,使用默认 clang"
    PREFERRED_LINKER="${COMPILER_TOOLCHAIN}clang"
fi

SYSROOT_FLAG=""
FUSE_LD_FLAG="-Clink-arg=-fuse-ld=${LD}"
if [[ "${PREFERRED_LINKER}" == *"rust-lld"* ]]; then
    FUSE_LD_FLAG=""
fi

RUSTFLAGS_LIST=()
if [[ "${USE_SYSROOT_FLAG}" == "true" ]]; then
    RUSTFLAGS_LIST+=("-Clink-arg=--sysroot=${SYSROOT_PATH}")
fi
if [[ -n "${FUSE_LD_FLAG}" ]]; then
    RUSTFLAGS_LIST+=("${FUSE_LD_FLAG}")
fi
eval "export CARGO_TARGET_${TRIPLE_ENV}_LINKER=\"${PREFERRED_LINKER}\""
eval "export CARGO_TARGET_${TRIPLE_ENV}_RUSTFLAGS=\"${RUSTFLAGS_LIST[*]}\""

"${CARGO_BIN}" build --release --target "${TARGET_TRIPLE}"

BUILD_OUTPUT="target/${TARGET_TRIPLE}/release/zoxide"
if [ ! -f "${BUILD_OUTPUT}" ]; then
    echo "Error: ${BUILD_OUTPUT} not found"
    exit 3
fi

INSTALL_ROOT="${TREE_INSTALL_HNP_PATH}"
BIN_DIR="${INSTALL_ROOT}/usr/bin"
MAN_DIR="${INSTALL_ROOT}/usr/share/man/man1"
DOC_DIR="${INSTALL_ROOT}/usr/share/doc/zoxide"
COMPLETION_DIR="${INSTALL_ROOT}/usr/share/zoxide/completions"

mkdir -p "${BIN_DIR}" "${MAN_DIR}" "${DOC_DIR}" "${COMPLETION_DIR}"
install -m 755 "${BUILD_OUTPUT}" "${BIN_DIR}/zoxide"
install -m 644 man/man1/*.1 "${MAN_DIR}/"
install -m 644 README.md CHANGELOG.md LICENSE "${DOC_DIR}/"
cp contrib/completions/* "${COMPLETION_DIR}/"

cp hnp.json "${INSTALL_ROOT}/"
pushd "${INSTALL_ROOT}/../"
    ${HNP_TOOL} pack -i "${INSTALL_ROOT}" -o "${ARCHIVE_PATH}/"
    tar -zvcf "${ARCHIVE_PATH}/ohos_zoxide_1.0.0.tar.gz" zoxide_1.0.0/
popd

export PREFIX="${sys_prefix}"

在这里插入图片描述

构建产物生成与 HNP 打包

在鸿蒙 OpenHarmony 环境中交叉编译并打包了 tree 工具 版本 2.2.1(进入构建根目录,执行构建脚本并指定鸿蒙 SDK 的 Linux 平台路径,触发 zoxide 的鸿蒙适配编译与打包流程)

cd ~/build
./build.sh --sdk ~/ohos-sdk/linux

在这里插入图片描述

检查构建产物

ls -lh output/

在这里插入图片描述

鸿蒙设备端 zoxide 安装与验证指南

上传适配包至设备(hdc 推送)

使用 hdc 工具推送(通过 hdc 工具将鸿蒙适配后的 zoxide 压缩包和 HNP 安装包,推送至已连接的鸿蒙设备的 /data/local/tmp 目录,为后续设备端安装做准备)

# 确保设备已连接
hdc file send ~/build/output/ohos_zoxide_1.0.0.tar.gz /data/local/tmp
hdc file send ~/build/output/zoxide.hnp /data/local/tmp
安装适配包(HNP 安装与目录验证)

进入鸿蒙设备上存放安装包的临时目录,通过 hnp 工具安装 zoxide 鸿蒙适配包,最后验证安装目录是否创建成功,确认安装结果

# 进入文件存放目录
cd /data/local/tmp

# 执行安装命令
hnp install ohos_zoxide_1.0.0.tar.gz

# 确认安装目录是否存在
ls /data/service/hnp/zoxide.org/zoxide_1.0.0
功能验证:zoxide 核心指令可用性测试

鸿蒙设备上通过执行版本查询、目录添加、索引查询命令,验证 zoxide 核心功能是否正常可用

# 验证版本信息
/data/service/hnp/zoxide.org/zoxide_1.0.0/usr/bin/zoxide --version

# 添加/data目录到zoxide索引
/data/service/hnp/zoxide.org/zoxide_1.0.0/usr/bin/zoxide add /data

# 查询已添加的data相关目录索引
/data/service/hnp/zoxide.org/zoxide_1.0.0/usr/bin/zoxide query data
补充验证:man 文档与 Shell 补全测试

指定 zoxide 的 man 文档路径,通过 man 命令查看其帮助文档,验证文档是否正常适配鸿蒙设备

man -M /data/service/hnp/zoxide.org/zoxide_1.0.0/usr/share/man zoxide

测试补全脚本功能:根据当前使用的 shell 类型(bash 或 zsh)加载对应补全文件,输入 zoxide 后空格按 Tab 键,若能正常补全相关命令,即说明补全功能可用

清理步骤:删除临时文件释放空间

删除鸿蒙设备临时目录中已完成安装的 zoxide 压缩包和 HNP 文件,清理冗余文件

# 删除上传的安装包和 hnp 文件
rm -rf /data/local/tmp/ohos_zoxide_1.0.0.tar.gz
rm -rf /data/local/tmp/zoxide.hnp

构建环节典型错误与解决方案汇总

1、rustup 下载目标卡住

  • 问题:rustup target add aarch64-unknown-linux-musl 长时间无输出
  • 原因:默认服务器下载慢/无响应
  • 解决:切换到 rsproxy 镜像或手动下载离线包后使用 rustup --offline target add …

2、缺少 rust-lld

  • 问题:rust-lld --version 提示 “Command not found”
  • 原因:stable toolchain 未安装完整或 PATH 未指向 rustup 提供的 rust-lld
  • 解决:安装 llvm-tools-preview、完整 profile,并将 ~/.rustup/…/bin 加入 PATH

3、旧版 rust-lld 不识别 --target=

  • 问题:rust-lld: error: unknown argument ‘–target=aarch64-unknown-linux-musl’
  • 原因:构建脚本仍调用 SDK/系统自带的旧 rust-lld
  • 解决:在 .cargo/config.toml 和 build_ohos.sh 中强制使用 rustup 的 rust-lld

4、强制添加 --target2 仍失败

  • 问题:rust-lld: error: unknown --target2 option
  • 原因:旧链接器根本不支持该参数
  • 解决:替换为新链接器而不是追加参数

5、复制 rustup 的 rust-lld 后缺库

  • 问题:error while loading shared libraries: libLLVM.so…
  • 原因:将 rustup 二进制直接放入 SDK,缺少其依赖的 libLLVM
  • 解决:使用 wrapper 脚本调用 rustup 目录下的 rust-lld 并设置 LD_LIBRARY_PATH

6、多余的 -fuse-ld 参数

  • 问题:rust-lld: error: unknown argument ‘-fuse-ld=…’
  • 原因:脚本默认追加 -fuse-ld,但 rust-lld 作为直接链接器不接受该参数
  • 解决:检测 PREFERRED_LINKER 是否包含 rust-lld,若是则不添加 -fuse-ld

7、本地运行 zoxide 报 Exec format error

  • 问题:构建产物是 aarch64 可执行文件,x86_64 WSL 无法直接运行
  • 原因:架构不匹配
  • 解决:在 ARM64 设备/模拟器或通过 qemu-aarch64-static 验证
【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器的建模仿真展开,重点介绍了基于Matlab的飞行器动力学模型构建控制系统设计方法。通过对四轴飞行器非线性运动方程的推导,建立其在三维空间中的姿态位置动态模型,并采用数值仿真手段实现飞行器在复杂环境下的行为模拟。文中详细阐述了系统状态方程的构建、控制输入设计以及仿真参数设置,并结合具体代码实现展示了如何对飞行器进行稳定控制轨迹跟踪。此外,文章还提到了多种优化控制策略的应用背景,如模型预测控制、PID控制等,突出了Matlab工具在无人机系统仿真中的强大功能。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程师;尤其适合从事飞行器建模、控制算法研究及相关领域研究的专业人士。; 使用场景及目标:①用于四轴飞行器非线性动力学建模的教学科研实践;②为无人机控制系统设计(如姿态控制、轨迹跟踪)提供仿真验证平台;③支持高级控制算法(如MPC、LQR、PID)的研究对比分析; 阅读建议:建议读者结合文中提到的Matlab代码仿真模型,动手实践飞行器建模控制流程,重点关注动力学方程的实现控制器参数调优,同时可拓展至多自由度或复杂环境下的飞行仿真研究。
评论 59
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wei_shuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值