前言

长期以来,鸿蒙生态中缺乏GCC编译器,一直是困扰开发者们的老大难问题:ohos-sdk 中的 LLVM 至今仍停留在 LLVM 15 版本。由于缺少高版本编译器,很多依赖高版本 C 标准、高版本 C++ 标准的开源软件都无法移植到鸿蒙平台上。

为了解决这个问题,Harmonybrew 社区的开发者们自发完成了 GCC 与 LLVM 的鸿蒙移植,并已录入 Harmonybrew 核心仓库。如今 gcc(GCC 16)与 llvm(LLVM 23)已经正式可用,据社区反馈,现在很少有项目编译不过——对鸿蒙开发者来说,这是一个实实在在的好消息。

Harmonybrew 与它的特色软件包

Harmonybrew 本该只负责包管理,但为了让大家能顺利地在 OpenHarmony 设备上写代码,社区还专门维护了一系列特色软件包,替开发者填平了代码签名、平台标识等底层"坑",让 OpenHarmony 上的操作逻辑重新对齐熟悉的 Linux / macOS:

名称说明
ohos-sdkOpenHarmony 官方工具链(内含 LLVM 15),其 lld 链接器经过封装默认启用链接器签名,编出的程序可直接在鸿蒙 PC 上运行
llvm-gcc-compat生成 ccgccld 等软链接,全部指向 ohos-sdk 里的 LLVM 工具链(模仿 macOS 的做法),编译开源软件无需手动指定 CC/CXX
devel-base类似 Debian 的 build-essential,级联引入 ohos-sdk、llvm-gcc-compat、make、coreutils 等,一键装出较完善的 C/C++ 编译环境
uname-is-linux通过劫持 libc 的 uname() 把系统标识伪装成 Linux,供有特殊需求的用户显式启用(Harmonybrew 及软件包并不依赖它)
musl-compat补充 musl libc 缺失符号的兼容垫片库,主要供 python@3.13/3.14 等 formula 使用

在这里插入图片描述

安装与使用

以下命令均在鸿蒙 PC 的 HiShell 环境中执行。

方式一:GCC(GCC 16)

1. 卸载冲突软件包

如果安装过 llvm-gcc-compat,需要先卸载:

brew uninstall llvm-gcc-compat

llvm-gcc-compat 里面实现了 gccld 两个软链接,会与 gcc、binutils 冲突。formula 中已做冲突声明,同时安装这些包 Homebrew 会直接报错。

2. 安装 gcc

brew install gcc

gcc 级联依赖了 binutils,并默认使用 binutils 里的 ld 作为链接器。由于社区给这个 ld 打上了自动签名补丁,由它生成的 ELF 文件默认带有代码签名,编译出来的程序可以直接在鸿蒙 PC 上运行,无需再用 ohos-sdk 的 binary-sign-tool 手动签名。

3. 使用 gcc

正常调用即可:

gcc my_program.c -o my_program

分发注意:程序依赖的运行时库(libgcc、libstdc++ 等)默认从 gcc 的安装目录读取(编译器自动设置 rpath,这遵循的是上游 Homebrew 的配置方式,并非 Harmonybrew 定制)。这意味着:

  • 默认情况下,把程序分发给其他设备时,目标设备也需要安装 Harmonybrew 并装上 gcc 来提供运行时库;
  • 如果想分发到任意鸿蒙设备上使用,需加 -static-libgcc-static-libstdc++ 等参数把运行时库静态链接进去(gcc 的安装提示里也有说明)。

方式二:LLVM(LLVM 23)

1. 卸载冲突软件包

如果安装过 ohos-sdk,需要先卸载:

brew uninstall ohos-sdk

ohos-sdk 里也带 LLVM 编译器、也提供 clang 命令,会与独立安装的 llvm 冲突(同样已做冲突声明)。

2. 安装 llvm 和 lld

brew install llvm lld

在 Homebrew 生态中,llvm 和 lld 是两个各自独立的 formula(虽然它们来自同一个开源项目)。在没有系统链接器的情况下,需要把 lld 也装上,由它提供 ld.lld 命令。社区同样给 lld 打上了自动签名补丁,编出的 ELF 默认带代码签名,可直接在鸿蒙 PC 上运行。

此外 llvm 系列还提供版本化的 formula,可按需选择:

brew install llvm@22 lld@22
brew install llvm@21 lld@21

3. 使用 llvm

clang my_program.c -o my_program

静态运行时库说明:独立安装的 llvm(LLVM 23)与 ohos-sdk 里的 LLVM 15 版本差距太大,运行时库互不兼容,无法链接到系统的运行时库。因此这版 llvm 被配置为默认静态链接所有运行时库,且只支持静态运行时库,完全不提供动态的运行时库(llvm 的安装提示里有说明)。

方式三:ohos-sdk(官方工具链,LLVM 15)

Harmonybrew 首推的编译工具链仍是 ohos-sdk(OpenHarmony 社区深度适配的官方工具链)。最省事的装法是通过 devel-base 一键引入整套编译环境:

brew install -y devel-base uname-is-linux

编译开源软件时有两点环境细节值得注意(HiShell 默认的 TMPDIR 和当前目录都承载在 hmdfs 上,可能因文件系统缺陷导致编译失败):

# TMPDIR 指向非 hmdfs 目录
export TMPDIR=/data/storage/el2/base/cache
# 工作目录也用非 hmdfs 目录
WORKDIR=/data/storage/el2/base/files/work
mkdir -p $WORKDIR && cd $WORKDIR
# 按需启用 uname 伪装
export LD_PRELOAD=$(brew --prefix)/opt/uname-is-linux/lib/libuname.so
# 之后正常 ./configure && make && make install,无需指定 --host 等交叉参数

其他语言场景速览

得益于上述基础设施,Harmonybrew 上的多语言开发体验已基本对齐 Linux/macOS:

  • Rustbrew install -y rust llvm-gcc-compat,之后 cargo build 开箱即用——rustc 默认调用的 cc 由 llvm-gcc-compat 提供,最终链接走封装过的 ld.lld,产物自动带签名。需要 nightly/特定版本可用仓库里的 rustup。
  • Python:仓库中的 python 把平台三元组硬编码为 aarch64-linux-musl,可直接复用 PyPI 现成的 musl 原生 wheel(如 numpy、cryptography);pip 还打了自动签名补丁,安装时自动为 so 文件签名。三方库请装在 venv 里(遵循 PEP 668)。
  • Node.js addonbrew install -y node python devel-base 后,未提供鸿蒙预构建包的三方库(如 bufferutil)会自动回退到 node-gyp 本地实时构建,产物自带签名、可直接加载。
  • Gobrew install -y go 开箱即用(formula 内置自动签名补丁);需要 cgo 时额外装 llvm-gcc-compat 即可。

移植情况(简述)

  • gccPR #20443):借助 Codex + DeepSeek-V4.1-Flash 完成移植。官方测试套件中 gcc/g++/gfortran/objc 等各套件以十万、万计的用例绝大多数通过,失败与错误仅为个位数到几十。
  • llvm(llvm@21 最初移植见 PR #18194,由社区开发者 @social4hyq 完成):之后由社区把 llvm@21 的适配补丁移植到 llvm@22、llvm@23(llvm 主包),并补充人工测试。LLVM/Clang 及各单元测试套件总计约 9 万用例、约 32 万条 RUN、近 600 万条 CHECK;"不支持"占比高属正常现象——llvm 只构建了 aarch64 后端,x86/mips 等后端用例被标记为 UNSUPPORTED。

提示:LLVM 与 GCC 两家测试框架不同、计数单位不同,两套表格数字不能直接横向比较。

重要:三套工具链不能混用

Harmonybrew 软件仓库现在有 3 套 C/C++ 编译工具链

  1. ohos-sdk(LLVM 15,官方工具链)
  2. llvm + lld(LLVM 21/22/23,社区移植)
  3. gcc + binutils(GCC 16,社区移植)

这 3 套工具链的产物不能互相链接,也不能在同一进程内混用,否则极易因运行时库冲突引发隐蔽崩溃。同一时间请只保留一套(相关的冲突包已在前文列明,Homebrew 也会主动拦截)。

总结

从"ohos-sdk 里 LLVM 停在 15、高版本开源软件几乎没法移植",到如今 GCC 16 与 LLVM 23 上架 Harmonybrew、三套工具链各司其职、代码签名与运行时库问题均被社区在底层替你解决——鸿蒙 PC 上的原生开发体验已经真正迈过了"能用"的门槛,进入了"好用"的阶段。如果你手上正有依赖新语言标准的项目想移植到鸿蒙,现在就是最好的上手时机:

# 二选一
brew uninstall llvm-gcc-compat && brew install gcc
brew uninstall ohos-sdk && brew install llvm lld

参考链接

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐