HarmonyOS鸿蒙PC三方库移植:Node.js 三方库鸿蒙 PC 移植指南
勘误与优化:本文纠正了常见资料中的关键技术错误,给出经过验证的实践方案。
如果你是 C/C++ 开发者,面对着一堆互相矛盾的 Node.js 鸿蒙移植资料感到困惑,本文就是为你写的。
更多交流学习,欢迎加入开源鸿蒙PC社区:https://harmonypc.csdn.net/
欢迎在PC社区平台申请新建项目:https://atomgit.com/OpenHarmonyPCDeveloper
猫哥的博客:https://blog.csdn.net/qq8864

一、先说结论:原始资料中的关键错误
❌ 错误 1:export OS=ohos 可以引导 node-gyp 交叉编译
事实:OS 环境变量对 node-gyp 无效。
node-gyp 底层使用 GYP(Generate Your Projects)构建系统。GYP 的 conditions 中出现的 OS 变量,是由 GYP 内部根据构建机器(开发机自身)的操作系统自动检测并硬编码的,而不是从命令行或环境变量读取的。
# GYP 内部逻辑(伪代码)
# 永远根据 BUILD 机器检测,不读取环境变量
if sys.platform == 'win32':
OS = 'win'
elif sys.platform == 'darwin':
OS = 'mac'
else:
OS = 'linux' # 所有类 Unix 系统(包括你的 Ubuntu 开发机)
所以即使你写了:
export OS=ohos # ← 这只设了一个 shell 变量,GYP 根本不看它
GYP 内部的 OS 变量仍然是 'linux'(如果你在 Linux 开发机上)。binding.gyp 里的条件:
["OS=='ohos'", {
"libraries": ["-lohos_special"]
}]
永远无法命中——因为 GYP 内部的 OS 永远是 'linux'。
❌ 错误 2:cross-env 可用于辅助 Node.js C++ 模块交叉编译
事实:cross-env 和交叉编译没有关系。
cross-env 的唯一功能是:抹平 Windows CMD 和 Unix Shell 设置环境变量的语法差异。
| 场景 | 作用 | 局限 |
|---|---|---|
cross-env NODE_ENV=production node app.js |
✅ 跨平台写法统一 | 只传简单字符串 |
cross-env OS=ohos CC=... npm install |
⚠️ 能传变量 | 传不了交叉编译器本身 |
| 解决 bcrypt 交叉编译问题 | ❌ 无能为力 | 缺少工具链和目标系统库 |
交叉编译需要:
- 完整的 NDK 编译器工具链(clang, clang++, ar, linker)
- 目标系统的 sysroot(头文件 + 运行时库)
- 正确的
--target和--sysroot编译参数
cross-env 只是一个环境变量语法代理,它不能凭空变出一个交叉编译器。
❌ 错误 3:交叉编译是"最优雅"的方式
事实:本机编译通常更简单可靠。
| 维度 | 本机编译(鸿蒙 PC 上) | 交叉编译(开发机上) |
|---|---|---|
| 环境复杂度 | 只需要 NDK | 需要 NDK + 跨平台工具链 + 版本对齐 |
| node-gyp 兼容性 | ✅ 原生支持,零干预 | ⚠️ 需要大量环境变量 hack |
| 调试排错 | 容易(本地改本地编) | 困难(编完传到目标机才能测) |
| 首次成功率 | 高 | 中低(坑多) |
| CI/CD 集成 | 需要鸿蒙 PC 作为构建节点 | ✅ Docker 化后方便 |
建议优先级:
- ✅ 首选:在鸿蒙 PC 上本机编译(只要你有环境)
- ✅ CI/CD:在 Docker 容器(含 NDK)中交叉编译
- ⚠️ 单独开发机交叉编译:仅在无法获取鸿蒙 PC 时考虑
❌ 错误 4:node-gyp “为鸿蒙选择 Clang”
事实:node-gyp 没有内置的鸿蒙支持。
node-gyp 的编译器选择逻辑:
| 宿主机 OS | node-gyp 默认选择 |
|---|---|
| Windows | MSVC (cl.exe) |
| macOS | Xcode Clang |
| Linux | GCC (g++) |
| 鸿蒙 | ❌ 不存在此选项 |
要让 node-gyp 使用鸿蒙 NDK 的 Clang,必须通过环境变量手动强制:
export CC="/path/to/ohos-ndk/llvm/bin/clang"
export CXX="/path/to/ohos-ndk/llvm/bin/clang++"
二、两条路线怎么选?本机编译 vs 交叉编译
你有鸿蒙 PC 物理机/虚拟机吗?
│
┌───┴───┐
│ │
YES NO
│ │
▼ ▼
┌──────────────┐ ┌──────────────────────────────┐
│ 路线 A │ │ 路线 B │
│ 本机编译 │ │ 交叉编译 │
│ │ │ │
│ ① 鸿蒙 PC │ │ ① 开发机(Ubuntu 推荐) │
│ ② 装 NDK │ │ ② 装鸿蒙 NDK for Linux │
│ ③ npm install│ │ ③ 配 CC/CXX/CFLAGS │
│ 一步到位 │ │ ④ npm install --build-from-source│
│ │ │ ⑤ scp 产物到鸿蒙 PC │
│ ✅ 最推荐 │ │ ⚠️ 备选(CI/CD 更好用 Docker)│
└──────────────┘ └──────────────────────────────┘
决策参考表
| 你的情况 | 推荐路线 | 原因 |
|---|---|---|
| 有鸿蒙 PC + NDK 已装好 | ✅ 路线 A(本机编译) | 最直接,node-gyp 自动处理一切 |
| 团队需要 CI/CD 流水线 | ✅ Docker 交叉编译 | 环境一致,可重复构建 |
| 只有 Windows 开发机,没有鸿蒙 PC | ⚠️ 路线 B(交叉编译) | 困难模式,做好踩坑准备 |
| 要移植的包很多(>10 个) | ✅ 路线 A(本机编译) | 每个包的交叉编译配置不同,逐个调试成本极高 |
| 项目只包含纯 JS 库 | ✅ 不需要编译 | 直接 copy node_modules 即可 |
三、路线 A:本机编译(鸿蒙 PC 上直接编译)—— 推荐
3.1 前置条件
- Node.js for HarmonyOS(鸿蒙版)
- HarmonyOS NDK(已安装)
- Python 3.x(node-gyp 依赖)
- make / ninja(构建工具)
3.2 配置 NDK 环境
# 将 NDK 编译器加入 PATH
export OHOS_NDK_HOME="/path/to/ohos-sdk/ohos-ndk"
export PATH="${OHOS_NDK_HOME}/llvm/bin:${PATH}"
# 验证编译器可用
clang --version
# 应输出类似:clang version 17.0.3 ... Target: x86_64-linux-ohos
关键验证:确认系统默认的 clang / clang++ 指向 NDK 的编译器,而不是其他 GCC 或系统自带的 Clang。如果系统已有其他 Clang,有两种做法:
方案 A(推荐):使用环境变量覆盖
# 在 ~/.bashrc 或项目脚本中指定
export CC="${OHOS_NDK_HOME}/llvm/bin/clang"
export CXX="${OHOS_NDK_HOME}/llvm/bin/clang++"
export AR="${OHOS_NDK_HOME}/llvm/bin/llvm-ar"
方案 B:将 NDK 的 bin 目录放在 PATH 最前面
export PATH="${OHOS_NDK_HOME}/llvm/bin:${PATH}"
# 这样 which clang 会先找到 NDK 的版本
⚠️ HMDFS 文件系统缺陷
HiShell 环境中TMPDIR默认指向/storage/Users/currentUser(HMDFS),该文件系统存在已知缺陷,可能导致node-gyp编译过程中临时文件写入失败。# 设置临时目录到非 HMDFS 路径 export TMPDIR=/data/storage/el2/base/files/tmp mkdir -p $TMPDIR
替代方案:使用 Harmonybrew 工具链(最推荐)
如果不想手动配置 NDK,可以直接用 Harmonybrew 的一站式开发工具包。它已包含 ohos-sdk clang(带代码签名的链接器封装)、llvm-gcc-compat、make、coreutils、python 等全部编译依赖:
# 安装开发工具包(含编译 Node.js 原生模块所需全部工具)
brew install devel-base
# 安装 Python(node-gyp 依赖)
brew install python
补充:
binutils— sqlite3 编译需要ar等归档工具。如果npm install报错ar: not found,安装:brew install binutils
3.3 编译原生模块(配好 NDK 后一步到位)
# 这一步在鸿蒙 PC 上执行(前提:NDK 环境变量已按 3.2 节配置好)
npm install bcrypt --build-from-source
npm install sqlite3 --build-from-source
调试提示:如果编译失败,用
--foreground-scripts查看完整日志:npm install bcrypt --build-from-source --foreground-scripts这会打印 node-gyp 的全部编译输出,方便定位具体报错位置(常见:找不到头文件、链接器参数错误)。
为什么本机编译如此简单?
配好 3.2 节的 NDK 环境变量后,npm install --build-from-source 会自动完成一切:
npm install bcrypt --build-from-source
│
▼
npm 下载 bcrypt 源码到 node_modules
│
▼
触发 node-gyp rebuild
│
▼
node-gyp 运行 Python 检测当前系统
│
▼
GYP 检测宿主机(鸿蒙 PC)→ 识别为类 Linux
│ 内部 OS = 'linux'
▼
GYP 使用 CC/CXX 环境变量 → 找到 NDK clang
│
▼
clang 内置 target 检测 → 输出 x86_64-linux-ohos 的 .node 文件
│
▼
✅ 成功!产物自动适配鸿蒙 PC 架构
这里有个微妙但关键的点:clang 本身就是交叉编译器。当你在鸿蒙 PC 上运行 NDK 的 clang 时,它默认的 --target 就是 x86_64-linux-ohos(或 aarch64-linux-ohos)。所以不需要手动指定 --target 和 --sysroot——如果 NDK 安装正确的话。
⚠️ 如果出现找不到系统头文件的错误,说明 clang 没有内置默认的 sysroot 路径,此时需要显式设置:
export CFLAGS="--sysroot=${OHOS_NDK_HOME}/sysroot" export CXXFLAGS="--sysroot=${OHOS_NDK_HOME}/sysroot" export LDFLAGS="--sysroot=${OHOS_NDK_HOME}/sysroot"
3.4 验证
# 检查编译产物的架构
file node_modules/bcrypt/build/Release/bcrypt_lib.node
# 期望输出:ELF 64-bit LSB shared object, x86-64, ...
# 或 ELF ... aarch64, ...(取决于鸿蒙 PC 架构)
# 功能验证
node -e "
const bcrypt = require('bcrypt');
const hash = bcrypt.hashSync('test', 10);
console.log('bcrypt works:', hash.startsWith('\$2b\$'));
"
四、路线 B:交叉编译(开发机为鸿蒙 PC 构建)
4.1 适用场景
你在这里 ──→ 只有一台开发机(Ubuntu/Mac/Windows)
没有鸿蒙 PC 硬件
但有鸿蒙 NDK for 开发机架构
且 Node.js 版本已对齐
4.2 真正的交叉编译机制
开发机 Ubuntu x86_64 鸿蒙 PC (目标)
┌────────────────────┐ ┌────────────────┐
│ node-gyp configure │ env │ │
│ ↓ │ vars │ │
│ GYP OS = 'linux' │ ─────→ │ .node 文件 │
│ ↓ │ CC/ │ 运行在 │
│ 生成 Makefile │ CXX │ x86_64-linux- │
│ ↓ │ CFLAGS│ ohos │
│ make 调用 NDK clang │ LDFLAGS │
│ → 交叉编译 │ │ │
└────────────────────┘ └────────────────┘
关键理解:
- GYP 的
OS变量永远是'linux'(在 Linux 开发机上) - 交叉编译不是靠改
OS变量实现的,而是靠 CC/CXX/CFLAGS/LDFLAGS 把编译器指向 NDK 的交叉编译器 - 因为 clang 本身是天然交叉编译器,只要给它正确的
--target,它就能输出目标架构的代码
4.3 完整交叉编译脚本
#!/bin/bash
# build-ohos-cross.sh — 真正的鸿蒙 PC 交叉编译脚本
# 在开发机(Ubuntu)上执行
set -euo pipefail
# ============================================
# 1. 配置鸿蒙 NDK 路径(根据实际安装位置修改)
# ============================================
OHOS_NDK="/path/to/ohos-ndk-linux"
TARGET_ARCH="x86_64" # 或 aarch64(取决于鸿蒙 PC 架构)
TARGET_TRIPLE="${TARGET_ARCH}-linux-ohos"
# ============================================
# 2. 配置交叉编译器
# ============================================
export CC="${OHOS_NDK}/llvm/bin/clang"
export CXX="${OHOS_NDK}/llvm/bin/clang++"
export AR="${OHOS_NDK}/llvm/bin/llvm-ar"
export LD="${OHOS_NDK}/llvm/bin/ld.lld"
# ============================================
# 3. 配置目标架构(重要!)
# ============================================
# 通知 node-pre-gyp / node-gyp 目标平台和架构
export npm_config_arch="${TARGET_ARCH}"
export npm_config_platform="linux" # 鸿蒙兼容 Linux 接口时用 linux
# ============================================
# 4. 注入编译标志(关键!)
# ============================================
export CFLAGS="--target=${TARGET_TRIPLE} --sysroot=${OHOS_NDK}/sysroot"
export CXXFLAGS="--target=${TARGET_TRIPLE} --sysroot=${OHOS_NDK}/sysroot"
export LDFLAGS="--target=${TARGET_TRIPLE} --sysroot=${OHOS_NDK}/sysroot"
echo "🔨 开始交叉编译 (${TARGET_TRIPLE})..."
# ============================================
# 5. 执行编译
# ============================================
npm install bcrypt --build-from-source
echo "✅ 交叉编译完成!"
file node_modules/bcrypt/build/Release/bcrypt_lib.node
4.4 Docker 化交叉编译(团队推荐)
# Dockerfile.ohos-builder
FROM ubuntu:22.04
# 安装基础依赖
RUN apt-get update && apt-get install -y \
python3 make git curl wget \
&& rm -rf /var/lib/apt/lists/*
# 安装鸿蒙 NDK(Linux 版)
# 注意:从 HarmonyOS 开发者官网获取最新 NDK 下载链接
# 搜索 "HarmonyOS NDK Linux" 或从 DevEco Studio SDK Manager 下载
# 下载后文件名为 ohos-ndk-*.tar.gz
RUN wget https://contentdeveloper.dbankcdn.com/.../ohos-ndk-linux.tar.gz \
&& tar -xzf ohos-ndk-linux.tar.gz -C /opt/ \
&& rm ohos-ndk-linux.tar.gz
# 安装目标 Node.js 版本(与鸿蒙 PC 一致)
ENV NODE_VERSION=18.16.0
RUN curl -fsSL https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz \
| tar -xzC /usr/local --strip-components=1
# 设置编译环境变量
ENV OHOS_NDK=/opt/ohos-ndk
ENV CC=${OHOS_NDK}/llvm/bin/clang
ENV CXX=${OHOS_NDK}/llvm/bin/clang++
ENV CFLAGS="--target=x86_64-linux-ohos --sysroot=${OHOS_NDK}/sysroot"
ENV CXXFLAGS="--target=x86_64-linux-ohos --sysroot=${OHOS_NDK}/sysroot"
ENV LDFLAGS="--target=x86_64-linux-ohos --sysroot=${OHOS_NDK}/sysroot"
WORKDIR /app
COPY package.json /app/
# 编译命令
RUN npm install --build-from-source
五、跨平台编译实践:bcrypt 与 sqlite3
5.1 bcrypt
依赖链路:
bcrypt
├── JS 封装层(无平台依赖)
└── C++ 层(bcrypt_node.cc)
├── Blowfish 算法(纯 C)
├── N-API 桥接
└── 可选:OpenSSL 加速
编译方式:
# 方式 1:本机编译(鸿蒙 PC)
npm install bcrypt --build-from-source
# 方式 2:交叉编译(开发机)
# 先设置好 CC/CXX/CFLAGS/LDFLAGS(见第四节脚本)
npm install bcrypt --build-from-source
# 方式 3:带 OpenSSL 加速(需要先交叉编译 OpenSSL .a)
npm install bcrypt --build-from-source \
--bcrypt_openssl_dir=/path/to/ohos-openssl
注意:bcrypt 的 binding.gyp 中通常没有 OS=='ohos' 条件——这没关系,因为 OS=='linux' 条件下的编译标志对鸿蒙同样适用(-pthread, -O3, -Wall 等)。
5.2 sqlite3
依赖链路:
sqlite3
├── JS 封装层
├── C++ 桥接层(N-API)
└── SQLite 引擎(sqlite3.c)
编译方式:
# 本机或交叉编译
npm install sqlite3 --build-from-source --sqlite_libname=embedded
为什么需要
--sqlite_libname=embedded? 默认情况下 node-sqlite3 的构建脚本会尝试链接系统已安装的 sqlite3 动态库。鸿蒙系统上没有这个库,所以需要改为编译自带的内嵌 SQLite 引擎(amalgamation 源码)。加了这个参数后,node-sqlite3 会直接将sqlite3.c编译进.node文件,不依赖外部库。
为什么 sqlite3 复杂一些?
node-sqlite3 的配置脚本是 JavaScript 写的(不是纯 GYP),它会:
- 尝试从网络下载预编译的
.node二进制(仅限 win/mac/linux) - 下载失败后回退到本地编译
- 根据
--sqlite_libname参数决定使用自带引擎还是系统库
所以在交叉编译时,无需担心下载问题——由于鸿蒙不在 node-sqlite3 的预编译支持列表中,网络下载会自然失败并自动回退到源码编译。
- 也可以使用
--build-from-source强制跳过下载,确保走源码编译路径
5.3 通用 checklist
- Node.js 版本一致(必须!)
node -v → v18.16.0(两边一样) - NDK 编译器可运行
clang --target=x86_64-linux-ohos --sysroot=${OHOS_NDK}/sysroot -E -x c /dev/null - 安装编译依赖
brew install devel-base # 一键安装 clang + make + coreutils brew install python # node-gyp 依赖 brew install binutils # sqlite3 编译需要 ar 等归档工具 - HMDFS 缺陷绕过:设置 TMPDIR
export TMPDIR=/data/storage/el2/base/files/tmp mkdir -p $TMPDIR - npm 标志用对
npm install --build-from-source # 强制本地编译,不下载预编译包 - 不要设置 OS=ohos(无效,且可能让某些构建脚本出错)
- 验证产物架构
file node_modules/*/build/Release/*.node # 预期输出:ELF 64-bit ... x86-64 或 ARM aarch64
六、cross-env 的真实定位与局限
6.1 cross-env 能做什么
# ✅ 跨平台设置环境变量(Windows/Linux/Mac 语法统一)
cross-env NODE_ENV=production node app.js
# ✅ 与 npm scripts 一起使用
# package.json:
{
"scripts": {
"build": "cross-env NODE_ENV=production webpack"
}
}
就这些。仅此而已。
6.2 cross-env 不能做什么
# ❌ 不能解决交叉编译问题
cross-env CC=/ndk/clang CXX=/ndk/clang++ npm install bcrypt --build-from-source
# ↑ 这只是设了两个环境变量,然后运行 npm install
# ↑ cross-env 不参与编译过程
# ↑ 编译器路径中含有斜杠和空格时容易转义出错
# ❌ 不能传递复杂的编译标志
cross-env CFLAGS="--target=x86_64-linux-ohos --sysroot=/path/to/sysroot" ...
# ↑ 包含空格和特殊字符,极易触发字符串分割错误
# ❌ 不能替代工具链
# cross-env 不会下载 NDK,不会安装 sysroot,不会配置链接器
6.3 正确的分工
┌─────────────────────────────────────────────────────────┐
│ 正确分工 │
├─────────────────────────────────────────────────────────┤
│ │
│ 简单的环境变量 → cross-env(方便跨平台) │
│ cross-env DEBUG=true node app.js │
│ │
│ 编译工具链配置 → shell 脚本 / Dockerfile │
│ build-ohos.sh 或 Dockerfile.ohos-builder │
│ │
│ 包管理命令 → npm / package.json scripts │
│ npm install --build-from-source │
│ │
└─────────────────────────────────────────────────────────┘
七、部署方案
| 方案 | 做法 | 推荐场景 |
|---|---|---|
| 离线打包 | 编译好 node_modules 整个打包 |
✅ 个人/小团队部署 |
| 私有 npm 仓 | 发布到 Verdaccio,鸿蒙 PC 上 npm install | ✅ 团队协作 |
| file: 依赖 | 用 "bcrypt": "file:../ohos_pkg/bcrypt" |
✅ 单机调试 |
红线原则:在鸿蒙 PC 上部署时,务必阻止重新编译:
# 如果必须在鸿蒙 PC 上执行 npm install
npm install --ignore-scripts
# 或者完全离线部署:不需要 npm install,直接跑
tar -czf app.tar.gz node_modules/ package.json app.js
# 传到鸿蒙 PC
tar -xzf app.tar.gz
node app.js
八、常见问题排查
Q1:编译时报错 “No rule to make target …”
原因:binding.gyp 中的 OS 条件不匹配。
["OS=='ohos'", {
"sources": ["ohos_specific.cc"]
}]
解决:在开发机上交叉编译时,GYP 的 OS 是 'linux',所以上面的 sources 永远不会被包含。需要手动修改 binding.gyp 或 patch:
# 方案 A:修改 binding.gyp,把 linux 条件拓展
sed -i "s/OS=='linux'/OS=='linux' or OS=='ohos'/g" node_modules/*/binding.gyp
# 方案 B(推荐):删除 ohos-only 的特殊处理,改用 linux 路径
# 因为鸿蒙 ABI 兼容 Linux
Q2:编译时报错找不到 <node_api.h>
原因:node-gyp 没有正确下载 Node.js 头文件。
解决:确认开发机的 Node.js 版本与鸿蒙 PC 一致,并手动下载头文件:
# 让 node-gyp 重新下载头文件
node-gyp rebuild
# 或者在项目目录下
npm install --build-from-source
Q3:编译出的 .node 文件在鸿蒙 PC 上报 “wrong ELF class”
原因:交叉编译的架构不对。比如开发机是 x86_64,鸿蒙 PC 是 aarch64。
解决:检查 CFLAGS 中的 --target 是不是正确的架构:
# 检查编译产物
file node_modules/*/build/Release/*.node
# 正确输出应为:
# ELF 64-bit LSB shared object, x86-64 (对 x86_64 鸿蒙)
# ELF 64-bit LSB shared object, ARM aarch64 (对 ARM 鸿蒙)
Q4:OS=ohos 到底什么时候有用?
仅有的几个场景:
- 包的
preinstall/install脚本中明确写了if (process.env.OS === 'ohos') { ... }(极少见) - 包的
binding.gyp被修改过,加上了OS=='ohos'条件(需要手动维护)
绝大多数情况下,OS=ohos 没有任何作用。
Q5:编译时报错 gyp ERR! stack Error: not found: make
原因:鸿蒙 PC 上未安装构建工具 make(或 ninja),node-gyp 需要它们来执行编译。
# 典型错误输出
gyp ERR! stack Error: not found: make
gyp ERR! stack at getNotFoundError ...
解决:安装构建工具:
# 鸿蒙 PC(Debian 系)
apt install make
# 或者安装 ninja(更快)
apt install ninja-build
# 验证安装
make --version
如果既没有 make 也没有 ninja,node-gyp 会在配置步骤直接报错退出,无法开始编译。
九、最终建议
✅ 正确做法
方案 A:本机编译(有鸿蒙 PC)
-
最简单可靠,避免一切交叉编译坑
-
NDK + Node.js +
npm install三步走- 准备环境(参考 3.2 节配置 NDK + 安装
devel-base) - 设置临时目录(绕过 HMDFS 缺陷)
export TMPDIR=/data/storage/el2/base/files/tmp && mkdir -p $TMPDIR - 安装三方库
npm install --build-from-source - 验证产物
file node_modules/*/build/Release/*.node
- 准备环境(参考 3.2 节配置 NDK + 安装
方案 B:Docker 交叉编译(CI/CD)
- 环境一致,可重复构建
- 适合团队多人协作
- 一次配置,处处运行
❌ 不要这样做
- × 不要设置
export OS=ohos(无效) - × 不要以为
cross-env能解决编译问题(它不能) - × 不要在没有 NDK 的鸿蒙 PC 上执行
npm install(建议用--ignore-scripts防御) - × 不要忽视 Node.js 版本一致性——编译机和目标机版本必须一致,否则 ABI 不兼容
📋 速查清单
- 确定鸿蒙 PC 架构(x86_64 还是 aarch64)
- 在鸿蒙 PC 上安装 Node.js + NDK(路线 A),或在开发机上安装 NDK for 开发机架构(路线 B)
- 安装编译依赖:
brew install devel-base python binutils - 设置
TMPDIR绕过 HMDFS 文件系统缺陷 - 确认 CC/CXX 指向 NDK clang(
which clang指向 NDK) - 确认
CFLAGS带了正确的--target(x86_64-linux-ohos / aarch64-linux-ohos) - 执行
npm install --build-from-source - 用
file命令验证产物架构(输出应为正确的 ELF) - Node.js 版本:开发机 = 目标机(必须一致)
- 如需打包分发,使用
npm pack将预编译产物归档
核心心法:
你不是在让鸿蒙"适配"Node.js,而是让 Node.js 在鸿蒙上正确编译和执行。
node-gyp 不认识鸿蒙,不需要让它认识。让它用正确的编译器和正确的参数,输出正确架构的二进制——这就够了。
OS=ohos是一个美丽的误会。真正的魔法是CC、CXX、CFLAGS和--target。
更多推荐


所有评论(0)