3. 编译环境搭建:Node.js与npm安装、hc-gen工具链、LLVM与GN工具、依赖库安装

环境搭建这事儿,说难不难,说简单也容易踩坑。我见过不少新手,代码拉下来一编译,哗啦啦报一堆错,结果一看——Node.js 版本不对,或者 libssl 没装。嗯,咱们今天就把这些基础依赖一个一个捋清楚。

核心原则:OpenHarmony 的编译环境对工具链版本非常敏感。别想着「用最新的准没错」,有时候老版本反而更稳。我个人习惯是严格按照官方推荐的版本来,少走弯路。

3.1 Node.js 与 npm 安装

Node.js 在编译过程中主要用来跑一些脚本工具,比如 hb 命令行工具。npm 则是包管理器,用来安装 js 依赖。

版本选择

组件 推荐版本 说明
Node.js v14.x 或 v16.x LTS v18+ 在某些场景下会有兼容问题
npm 随 Node.js 自带 建议升级到 8.x 以上

我曾经踩过的坑:用 Node.js v18 编译 OpenHarmony 3.1 Release,结果 hb 工具一直报错,折腾了两天才发现是 Node 版本太高,某些 API 被废弃了。降回 v16,一次过。

安装步骤(Ubuntu 20.04/22.04)

  1. 下载 Node.js 二进制包(推荐用 nvm 管理,方便切换版本)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
source ~/.bashrc
nvm install 16.20.0
nvm use 16.20.0
  1. 验证安装
node -v   # 输出 v16.20.0
npm -v    # 输出 8.x.x
  1. 配置 npm 镜像源(国内用户必做,不然下载慢到怀疑人生)
npm config set registry https://registry.npmmirror.com

小技巧:如果你在公司内网,可能还需要配置代理。用 npm config set proxy http://your-proxy:port 搞定。

3.2 hc-gen 工具链安装

hc-gen 是 HDF(Hardware Driver Foundation)的代码生成工具。说白了,它帮你自动生成驱动框架代码,省得你手写一堆模板。

这个工具比较特殊,它不是通过 apt 或 npm 安装的,而是需要从 OpenHarmony 源码仓库单独下载。

安装步骤

  1. 下载 hc-gen 二进制
wget https://repo.huaweicloud.com/harmonyos/compiler/hc-gen/0.65/linux/hc-gen-0.65-linux.tar.gz
tar -xzf hc-gen-0.65-linux.tar.gz
sudo cp hc-gen /usr/local/bin/
sudo chmod +x /usr/local/bin/hc-gen
  1. 验证安装
hc-gen -v   # 输出版本号,比如 0.65

注意:hc-gen 依赖 glibc 2.31 以上版本。如果你用的是 Ubuntu 18.04,可能会报 GLIBC_2.31 not found。我建议直接上 Ubuntu 20.04 或 22.04,省心。

3.3 LLVM 与 GN 工具

LLVM 是编译器工具链,OpenHarmony 用它来编译 C/C++ 代码。GN 是元构建系统,负责生成 Ninja 构建文件。这两个是编译环境的核心。

LLVM 版本要求

OpenHarmony 版本 LLVM 版本 备注
3.0 / 3.1 12.0.1 官方预编译包
3.2 / 4.0 15.0.4 支持更多架构优化

安装 LLVM

我个人习惯直接下载官方预编译包,不自己编译 LLVM——那玩意儿编译一次能让你等一两个小时。

wget https://repo.huaweicloud.com/harmonyos/compiler/llvm/15.0.4/linux/llvm-15.0.4-linux-x86_64.tar.gz
tar -xzf llvm-15.0.4-linux-x86_64.tar.gz
sudo mv llvm-15.0.4 /opt/
export PATH=/opt/llvm-15.0.4/bin:$PATH
echo 'export PATH=/opt/llvm-15.0.4/bin:$PATH' >> ~/.bashrc

安装 GN

GN 工具更简单,就一个二进制文件。

wget https://repo.huaweicloud.com/harmonyos/compiler/gn/1717/linux/gn-linux-x86_64-1717.tar.gz
tar -xzf gn-linux-x86_64-1717.tar.gz
sudo mv gn /usr/local/bin/
gn --version   # 输出 1717

验证工具链:运行 clang --version 和 gn --version,确保路径正确。如果提示「command not found」,检查 PATH 是否配置对了。

3.4 依赖库安装(libssl、libffi 等)

编译过程中,很多工具和库会依赖系统级的动态链接库。缺了它们,编译到一半就会报错,而且错误信息往往很隐晦。

必备依赖库清单

库名 用途 安装命令(Ubuntu)
libssl-dev SSL/TLS 支持,hb 工具和网络下载依赖 sudo apt install libssl-dev
libffi-dev 外部函数接口,Python 扩展依赖 sudo apt install libffi-dev
zlib1g-dev 压缩库,编译工具链依赖 sudo apt install zlib1g-dev
libncurses5-dev 终端控制库,menuconfig 工具依赖 sudo apt install libncurses5-dev
flex / bison 词法/语法分析器,编译 DTS 文件需要 sudo apt install flex bison

一键安装命令

sudo apt update
sudo apt install -y libssl-dev libffi-dev zlib1g-dev libncurses5-dev flex bison

我曾经遇到的坑:有一次编译到 70% 突然报错 cannot find -lssl,查了半天发现 libssl-dev 没装。你以为系统自带了?其实很多云服务器的最小化镜像是不带这些开发库的。所以,装完系统第一件事,先把这些依赖装上。

3.5 环境验证与常见问题

所有工具装完后,我建议你做一个快速验证,确保每个组件都可用。

验证脚本

echo "=== Node.js ===" && node -v
echo "=== npm ===" && npm -v
echo "=== hc-gen ===" && hc-gen -v
echo "=== LLVM ===" && clang --version | head -1
echo "=== GN ===" && gn --version
echo "=== libssl ===" && dpkg -l | grep libssl-dev
echo "=== libffi ===" && dpkg -l | grep libffi-dev

常见问题速查表

错误信息 可能原因 解决方案
GLIBC_2.31 not found 系统 glibc 版本过低 升级到 Ubuntu 20.04+
cannot find -lssl libssl-dev 未安装 sudo apt install libssl-dev
node: /lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.28' not found Node.js 版本与系统 glibc 不匹配 使用 nvm 切换低版本 Node
gn: error while loading shared libraries: libstdc++.so.6 缺少 C++ 运行时库 sudo apt install libstdc++6

3.6 整体环境结构图

下面这张图帮你理清各个工具之间的关系。说白了,就是从上到下,一层层依赖。

OpenHarmony 编译环境依赖关系图 hb 编译命令 (Node.js + npm) GN → Ninja (元构建系统) LLVM/Clang 编译器工具链 hc-gen (HDF代码生成) 系统依赖库 (libssl, libffi等) Python3 + pip 编译产物 (bin, img, so) 说明:每一层都依赖下一层正常工作。如果底层缺失,上层编译必然失败。

我的建议:环境搭建完成后,先跑一个简单的 hello world 编译测试,确认整个链路通顺。别等到编译整个系统时才发现问题,那时候排查起来就头大了。