开源鸿蒙PC三方库复现:在 CodeArts 里编译、签名并跑起 libplacebo
开源鸿蒙PC三方库复现:在 CodeArts 里编译、签名并跑起 libplacebo
欢迎加入开源鸿蒙 PC 社区:https://harmonypc.csdn.net/
开源仓库地址:https://atomgit.com/OpenHarmonyPCDeveloper/ohos_libplacebo_pc
这一篇换到鸿蒙 PC 自带的 CodeArts IDE,演示怎么把 libplacebo 这类 C/C++ 三方库直接编译、签名、运行起来。
本篇基于社区作者 wei_shuo 的实践整理(https://weishuo.blog.csdn.net/article/details/161293953),结合我自己的复现做了重新组织。
DevEco 和 CodeArts,到底用哪个
简单区分一下我的认知:DevEco 偏「写鸿蒙应用」,CodeArts 在这个场景里更像一个跑在鸿蒙 PC 上的本地 C/C++ 开发环境(CMake + Ninja + clangd)。如果我想在鸿蒙 PC 上就地写一个调用三方库的命令行小程序、快速验证库能不能用,CodeArts 会更顺手。
这次我要解决的,是 CodeArts 场景下绕不过的四个问题:
- 头文件路径怎么让编译器找到;
- 链接库路径怎么配;
- 运行时怎么找到
.so; - 鸿蒙强制签名怎么自动化。

准备工作
- CodeArts IDE,建好一个 C++ 工程;
- 确认 BiSheng LLVM 工具链和
binary-sign-tool可用; - 拿到 libplacebo 的鸿蒙适配产物(
.so+ 头文件,来自前面交叉编译的 tar 包)。
产物的前置检查
和上一篇一样,先 llvm-readelf -d 体检:看 NEEDED 依赖、看 SONAME。带版本号的 .so(如 libplacebo.so.362)这次我没改 SONAME,而是把带版本号的文件也一并保留——因为运行时链接器按 SONAME 找,文件在就行。这是和 DevEco 场景一个不同的处理取向。
文件怎么摆
我在工程根目录建了个 third_party/:
third_party/
├── include/libplacebo/*.h ← 头文件
└── lib/
├── libplacebo.so ← 主库
└── libplacebo.so.362 ← 版本号软链/实体,SONAME 对应

五个文件的配置要点
CodeArts 这套要改的文件比 DevEco 多一些,因为它还要管「IDE 的代码索引」和「运行/调试时的环境」。我把五个文件的职责记成一张表:
| 文件 | 解决什么 |
|---|---|
CMakeLists.txt |
头文件路径、链接库、BUILD_RPATH、编译后自动拷贝+签名 |
main.cpp |
写测试代码,调用 libplacebo 验证各模块 |
compile_commands.json |
手动补 -I 路径,治 clangd 头文件爆红 |
tasks.json |
强制重建 + 自动签名 + 一键运行 |
launch.json |
设 LD_LIBRARY_PATH,让调试器找得到库 |
下面挑几个有「鸿蒙特色」的展开。
签名:这是鸿蒙最硬的一道门
鸿蒙系统要求所有可执行文件和 .so 都必须经过 binary-sign-tool sign 签名,否则 dlopen 直接拒绝加载。我的做法是把签名动作塞进构建的 POST_BUILD 阶段,编完自动签,不用每次手动敲。
RUNPATH:用 $ORIGIN 让程序「自己找同级目录」
我在 CMake 里设了 BUILD_RPATH "$ORIGIN"。$ORIGIN 表示「可执行文件自己所在的目录」,这样它会优先在同级目录找 .so,部署时整个文件夹搬走都不会断链,非常省心。
一个反直觉的小技巧:强制重链
Ninja 很「聪明」,源码没变它就不重新链接,于是 POST_BUILD 的签名也不会触发,导致我改了东西却跑的是旧的、没签名的产物。解法很糙但有效——在 tasks.json 里构建前先 rm -f 掉旧的可执行文件,逼 Ninja 重链一次,签名就跟着触发了。
跑起来
配置完点「开始执行」,CodeArts 会一条龙跑完:清理 → 编译 → 链接 → 签名 → 运行。我写的 main.cpp 里覆盖了 libplacebo 的日志系统、GPU、缓存、纹理、渲染器等十多个模块的冒烟测试,全绿就说明库在鸿蒙上是真能用的。

进阶:让它真的「画」出东西
光打印 OK 还不够直观,我顺手扩了下 main.cpp,做了个零依赖的 BMP 编码(自己拼 BMP 文件头,不引图像库),用 libplacebo 的纹理创建/上传/下载 API 生成了三张图:RGB 渐变、SDR/HDR 对比、GPU 能力信息图。能输出图片,意味着纹理这条核心路径是通的,比一堆文字日志更有说服力。
小结
CodeArts 这条路的价值在于「就地验证」——不用先搭 DevEco 应用工程,在鸿蒙 PC 上就能把一个三方库编出来、签上名、跑起来甚至出图。整套配置抽象出来就是个模板,换 FFmpeg、OpenSSL 照搬即可。
到这里,libplacebo 的「应用层调用(DevEco)」和「本地开发(CodeArts)」两条线都通了。下一篇我打算回到源头,专门聊聊 HPKBUILD 这个配方文件该怎么从零写出来。感谢 wei_shuo 的开源分享。
更多推荐





所有评论(0)