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)
- 下载 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
- 验证安装
node -v # 输出 v16.20.0
npm -v # 输出 8.x.x
- 配置 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 源码仓库单独下载。
安装步骤
- 下载 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
- 验证安装
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 整体环境结构图
下面这张图帮你理清各个工具之间的关系。说白了,就是从上到下,一层层依赖。
我的建议:环境搭建完成后,先跑一个简单的 hello world 编译测试,确认整个链路通顺。别等到编译整个系统时才发现问题,那时候排查起来就头大了。