开源鸿蒙PC三方库:交叉编译 libplacebo,初探 Meson 构建系统

欢迎加入开源鸿蒙 PC 社区:https://harmonypc.csdn.net/

开源仓库地址:https://atomgit.com/OpenHarmonyPCDeveloper/ohos_libplacebo

libplacebo 用的是 Meson 构建系统,和前面 MediaInfo 的 CMake 是两套路子。

本篇基于社区作者 wei_shuo 的《https://weishuo.blog.csdn.net/article/details/161294114》整理,结合我自己的复现重新讲述。验证截图复用自原作者公开素材,致谢。

先认识一下 libplacebo

libplacebo 是从 mpv 项目里剥离出来的 GPU 加速视频/图像渲染库,做色彩管理、HDR 处理、缩放这些活儿。后面要适配的 mpv 就重度依赖它,所以先把它单独啃下来,是为后面的「多层依赖」打地基。

项目 信息
libplacebo
构建系统 Meson + Ninja
依赖 fast_float 等
构建主机 WSL Ubuntu 24.04
目标架构 arm64-v8a

在这里插入图片描述

CMake 和 Meson 的差异,落到适配上是什么

这是这篇我最想讲清楚的点。前面 MediaInfo 是 CMake,HPKBUILD 里直接 cmake ... -DOHOS_ARCH=$ARCH 就能交叉编译。Meson 不一样,它要求你提供一个交叉编译配置文件(cross file),把工具链、目标机器信息都写在里面。

所以 libplacebo 的 HPKBUILD 里,build() 阶段多了一步:先生成一个 ohos-cross.ini,再 meson setup --cross-file ohos-cross.ini 去配置。这个 ini 文件里要声明清楚 clang、clang++、ar、strip 等工具的路径,以及 system = 'linux'cpu_family = 'aarch64' 这类目标机器属性。

理解了这点,再看 Meson 类项目就不慌了:核心动作是「写对 cross file」

适配里我重点处理的几件事

1. 砍掉用不上的图形后端

libplacebo 默认会尝试启用 Vulkan、OpenGL、D3D11 等一堆图形后端。但鸿蒙 PC 这边这些后端要么没有、要么没必要,全启用反而引入一堆找不到的依赖。我的处理是在 Meson 选项里把它们逐个 disabled 掉,只保留鸿蒙上确实能用的部分。

经验:交叉编译第三方库,「做减法」往往比「做加法」更重要。先用最小功能集编通,再按需加回来。

2. fast_float 依赖的处理

libplacebo 编译时需要 fast_float 这个头文件库。正常情况下 Meson 会通过 wrap 机制去网上下载,但交叉编译环境里联网下载经常不稳。我的做法是提前把它下好放到对应目录,让 Meson 直接用本地的,避免构建中途卡在下载上。

3. 那些「环境性」的老朋友

又是熟悉的几位:

  • CRLF 换行符:WSL + Windows 共享目录下创建的脚本带 \r,跑起来报 $'\r': command not found。Python 二进制转 LF 解决。
  • 构建缓存:改完 HPKBUILD 不清 hpk_build.csv,lycium 直接跳过。
  • 产物手动复制:Meson install 后产物布局有时和预期不完全一致,需要在 archive 阶段手动把 .so、头文件归拢到位。
    在这里插入图片描述

构建与验证

cd lycium_plusplus/thirdparty && mkdir -p libplacebo
# ... 放好 HPKBUILD / hnp.json / README.OpenSource / HPKCHECK
cd ../lycium
# 清缓存
grep -v 'libplacebo' usr/hpk_build.csv > usr/hpk_build.csv.tmp && mv usr/hpk_build.csv.tmp usr/hpk_build.csv
./build.sh libplacebo

编完用 file 确认产物是 ARM aarch64 的 ELF,这一步是最基本的「编对架构了没」的体检。

在这里插入图片描述

我的 FAQ 速查

原文整理了 8 个典型问题,我把自己实际撞上的几个记一下:

  • Meson 报 Unknown option:选项名拼错或版本不支持,对着该版本的 meson_options.txt 核对。
  • fast_float 缺失:本地放好,或允许 wrap 下载。
  • 构建被跳过:清 hpk_build.csv 缓存。
  • 产物装不上:检查 archive 阶段的路径,必要时手动复制。

小结

libplacebo 这一篇的真正收获,是把 Meson 交叉编译这条路走通了——核心就是「写对 cross file + 做功能减法」。这和前面 CMake 的套路并列,构成了我适配 C/C++ 库的两大基本盘。

更重要的是,它为下一篇埋好了伏笔:mpv 同样是 Meson 项目,而且依赖 libplacebo。下一篇我们就正式进入「多层依赖树」这个系列里最硬的骨头。感谢原创适配作者 wei_shuo 的分享。

Logo

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

更多推荐