开源鸿蒙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 场景下绕不过的四个问题:

  1. 头文件路径怎么让编译器找到;
  2. 链接库路径怎么配;
  3. 运行时怎么找到 .so
  4. 鸿蒙强制签名怎么自动化。

在这里插入图片描述

准备工作

  • 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 的开源分享。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐