开源鸿蒙PC三方库:交叉编译 libplacebo,初探 Meson 构建系统
开源鸿蒙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 的分享。
更多推荐



所有评论(0)