鸿蒙 PC 终于能用上GCC编译器了:Harmonybrew 上的 GCC 16 与 LLVM 23
前言
长期以来,鸿蒙生态中缺乏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-sdk | OpenHarmony 官方工具链(内含 LLVM 15),其 lld 链接器经过封装默认启用链接器签名,编出的程序可直接在鸿蒙 PC 上运行 |
llvm-gcc-compat | 生成 cc、gcc、ld 等软链接,全部指向 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 里面实现了 gcc 和 ld 两个软链接,会与 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:
- Rust:
brew 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 addon:
brew install -y node python devel-base后,未提供鸿蒙预构建包的三方库(如 bufferutil)会自动回退到 node-gyp 本地实时构建,产物自带签名、可直接加载。 - Go:
brew install -y go开箱即用(formula 内置自动签名补丁);需要 cgo 时额外装 llvm-gcc-compat 即可。
移植情况(简述)
- gcc(PR #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++ 编译工具链:
ohos-sdk(LLVM 15,官方工具链)llvm + lld(LLVM 21/22/23,社区移植)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
参考链接
- 博客原文(GCC 16 / LLVM 23 可用公告):https://blog.csdn.net/hqzing/article/details/165876910
- Harmonybrew 特色软件包文档:https://atomgit.com/Harmonybrew/docs/blob/main/zh-CN/user/featured-packages.md
- gcc 移植 PR:https://atomgit.com/Harmonybrew/homebrew-core/pull/20443
- llvm@21 移植 PR:https://atomgit.com/Harmonybrew/homebrew-core/pull/18194
更多推荐


所有评论(0)