文章目录
-
-
-
- [前言 鸿蒙PC生态的拓展与三方库移植意义](#前言 鸿蒙PC生态的拓展与三方库移植意义)
- **一、移植工具链环境搭建**
-
- [1. **配置SDK路径与基础工具链**](#1. 配置SDK路径与基础工具链)
- [2. **CMake工具链配置**](#2. CMake工具链配置)
- **二、libogg库移植实战**
-
- [1. **源码准备与构建脚本**](#1. 源码准备与构建脚本)
- [2. **关键编译参数解析**](#2. 关键编译参数解析)
- [3. **鸿蒙HNP包封装**](#3. 鸿蒙HNP包封装)
- 开始执行编译
- 编译注意事项
- **三、验证与调试**
-
- [1. **库文件验证**](#1. 库文件验证)
- [2. **运行时依赖检查**](#2. 运行时依赖检查)
- **四、工程化建议**
-
- [1. **依赖管理**](#1. 依赖管理)
- [2. **自动化构建**](#2. 自动化构建)
- [3. **提交至鸿蒙社区**](#3. 提交至鸿蒙社区)
- **五、总结**
-
-
前言 鸿蒙PC生态的拓展与三方库移植意义
随着HarmonyOS正式进军PC领域,构建完善的软件生态成为关键。由于鸿蒙PC版的底层基于OpenHarmony与Linux内核的混合架构,现有Linux/Windows平台的开源库需要针对鸿蒙PC进行交叉编译 与系统级适配 。本文将以开源音频库libogg为例,详细介绍如何在鸿蒙PC平台上完成三方库的移植,并提供可复用的工程化方案。
一、移植工具链环境搭建
鸿蒙PC开发需使用专用的交叉编译工具链 ,关于环境的搭建,参见猫哥的上一篇博文:
以下是核心环境配置步骤:
1. 配置SDK路径与基础工具链
虽然啊,官方提供的有示例的项目工程,build.sh构建脚本。但是呢,那个适合批量化。默认配置一次的构建了N多个写在dependcy.json文件中的库,不太方便调试。而我这个呢,适合单独对某个库进行方便的编译测试。
在于build.sh脚本同目录下创建 exports.sh 文件,先不使用build.sh构建脚本。
声明SDK路径与编译工具:
bash
echo "hello exports"
## 你的SDK路径,根据你实际的改下配置
SDK_PATH="/root/ohos-sdk/linux"
echo "SDK_PATH:$SDK_PATH"
export OHOS_SDK="$SDK_PATH"
export HNP_PERFIX=
export COMPILER_TOOLCHAIN=${OHOS_SDK}/native/llvm/bin/
BUILD_OS=$(uname)
PYTHON=$(python --version)
echo "python : $PYTHON"
export CC=${COMPILER_TOOLCHAIN}clang && echo "CC : ${CC}"
export CXX=${COMPILER_TOOLCHAIN}clang++ && echo "CXX : ${CXX}"
export HOSTCC=${CC} && echo "HOSTCC : ${HOSTCC}"
export HOSTCXX=${CXX} && echo "HOSTCXX : ${HOSTCXX}"
export CPP="${CXX} -E" && echo "CPP : ${CPP}"
export AS=${COMPILER_TOOLCHAIN}llvm-as && echo "AS : ${AS}"
export LD=${COMPILER_TOOLCHAIN}ld.lld && echo "LD : ${LD}"
export STRIP=${COMPILER_TOOLCHAIN}llvm-strip && echo "STRIP : ${STRIP}"
export RANLIB=${COMPILER_TOOLCHAIN}llvm-ranlib && echo "RANLIB : ${RANLIB}"
export OBJDUMP=${COMPILER_TOOLCHAIN}llvm-objdump && echo "OBJDUMP : ${OBJDUMP}"
export OBJCOPY=${COMPILER_TOOLCHAIN}llvm-objcopy && echo "OBJCOPY : ${OBJCOPY}"
export NM=${COMPILER_TOOLCHAIN}llvm-nm && echo "NM : ${NM}"
export AR=${COMPILER_TOOLCHAIN}llvm-ar && echo "AR : ${AR}"
export SYSROOT=${OHOS_SDK}/native/sysroot
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}/usr/lib/aarch64-linux-ohos
export PKG_CONFIG_PATH=${PKG_CONFIG_SYSROOT_DIR}
export PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_SYSROOT_DIR}
export HNP_TOOL=${OHOS_SDK}/toolchains/hnpcli
export CMAKE=${OHOS_SDK}/native/build-tools/cmake/bin/cmake
export TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake
export WORK_ROOT=${PWD}
export ARCHIVE_PATH=${WORK_ROOT}/output
export COMM_DEP_PATH=${WORK_ROOT}/deps_install
export HNP_PUBLIC_PATH=${HNP_PERFIX}/data/service/hnp/
export MAKE_QUITE_PARAM=" -s "
export CONFIGURE_QUITE_PARAM=" --quiet "
export TARGET_PLATFORM=aarch64-linux-ohos
export CFLAGS="-fPIC -D__MUSL__=1 -D__OHOS__ -fstack-protector-strong --target=${TARGET_PLATFORM} -fuse-ld=${LD} --sysroot=${SYSROOT}"
export CXXFLAGS="${CFLAGS} "
export LD_LIBRARY_PATH=${SYSROOT}/usr/lib:${LD_LIBRARY_PATH}
export LDFLAGS="${LDFLAGS} -fuse-ld=${LD} --target=${TARGET_PLATFORM} --sysroot=${SYSROOT}"
export HOST_TYPE="--host=aarch64-linux --build=aarch64-linux"
#export NCURSES_INSTALL_HNP_PATH="${HNP_PUBLIC_PATH}/ncurses.org/ncurses_v6.4"
mkdir -p ${HNP_PUBLIC_PATH}
mkdir -p ${ARCHIVE_PATH}
mkdir -p code
#export PKG_CONFIG_PATH="${CUSTOM_PREFIX}/lib/pkgconfig:$PKG_CONFIG_PATH"
通过执行 source exports.sh 激活环境。
bash
source exports.sh
2. CMake工具链配置
鸿蒙SDK提供专用的ohos.toolchain.cmake文件,该配置也已经写到exports.sh中了。这里只是说明下,它用于指导CMake的交叉编译行为:
bash
export TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake
二、libogg库移植实战
libogg 是Xiph.Org基金会维护的开源多媒体容器库,专门用于处理 Ogg比特流格式(一种自由、开放的多媒体容器格式)。Ogg格式广泛应用于音频(如Vorbis、Opus)、视频(Theora)等编码数据的封装,具有跨平台、低开销、流式传输友好的特点。作为Ogg生态的核心基础库,libogg提供了数据封装/解封装的核心能力,是众多开源音频项目(如VLC、FFmpeg)的底层依赖。
官方网站:访问 https://www.xiph.org/ogg/
libogg库下载地址:https://www.xiph.org/downloads/
gitcode上建了个仓:https://gitcode.com/qq8864/libogg
1. 源码准备与构建脚本
在libogg源码根目录创建 build_ohos.sh:
bash
#!/bin/bash
# 编译安装libogg
${CMAKE} \
-DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_INSTALL_PREFIX=${LIBOGG_INSTALL_HNP_PATH}
make VERBOSE=1 -j$(nproc)
make install
# 生成鸿蒙HNP软件包
cp hnp.json ${LIBOGG_INSTALL_HNP_PATH}/
pushd ${LIBOGG_INSTALL_HNP_PATH}/../
${HNP_TOOL} pack -i ${LIBOGG_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/
tar -zvcf ${ARCHIVE_PATH}/ohos_libogg_1.3.6.tar.gz libogg_1.3.6/
popd
2. 关键编译参数解析
-DCMAKE_TOOLCHAIN_FILE:指定鸿蒙交叉编译配置文件,自动处理ABI、sysroot路径。-DBUILD_SHARED_LIBS=ON:生成动态库(.so),适配鸿蒙动态链接机制。-DCMAKE_INSTALL_PREFIX:设置库的安装路径,需匹配鸿蒙的文件系统规范。
3. 鸿蒙HNP包封装
需现在libogg项目根目录下建个hnp.json元数据文件,用于对包就行描述。
hnp.json文件内容:
javascript
{
"type":"hnp-config",
"name":"libogg",
"version":"1.3.6",
"install":{}
}
使用鸿蒙提供的hnpcli工具打包库文件:
bash
# 示例:生成.hnp格式软件包
${HNP_TOOL} pack -i ${LIBOGG_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/
生成的 .hnp 包可直接通过鸿蒙的软件管理工具安装。
开始执行编译
bash
#前面,确保已执行过一次source exports.sh
#给脚本可执行权限
chmod +x build_ohos.sh
#在libogg项目根目录下执行脚本
./build_ohos.sh
编译成功截图:

编译注意事项
如果待移植的项目中支持cmake的话,建议最好直接用cmake。这样会简单太多。否则使用configure脚本配置参数的方式,去生成makefile再去编译的话,有时候不是那么顺利。比如libogg这个库,猫哥一开始用configure脚本生成makefile的形式。
编译报错:

有知道原因的小伙伴吗?
一开始的构建脚本build_ohos.sh是这样写的:
bash
export LIBOGG_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/libogg.org/libogg_1.3.6
make clean
./configure --host=aarch64-linux-musl \
--prefix=${LIBOGG_INSTALL_HNP_PATH}
make VERBOSE=1 -j$(nproc)
make install
cp hnp.json ${LIBOGG_INSTALL_HNP_PATH}/
pushd ${LIBOGG_INSTALL_HNP_PATH}/../
${HNP_TOOL} pack -i ${LIBOGG_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/
tar -zvcf ${ARCHIVE_PATH}/ohos_libogg_1.3.6.tar.gz libogg_1.3.6/
popd
三、验证与调试
1. 库文件验证
检查输出是否包含鸿蒙平台的目标文件:
bash
file ${LIBOGG_INSTALL_HNP_PATH}/lib/libogg.so
# 预期输出:ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, ...
2. 运行时依赖检查
通过 ldd 命令验证动态库依赖是否满足:
bash
ldd ${LIBOGG_INSTALL_HNP_PATH}/lib/libogg.so
# 应显示鸿蒙系统库路径,例如:/system/lib/libc.so
四、工程化建议
1. 依赖管理
- 使用
dependency.json文件声明库版本及依赖关系,例如:
json
{
"name": "libogg",
"version": "1.3.6",
"dependencies": [],
"platform": "aarch64-linux-ohos"
}
2. 自动化构建
集成CI/CD流程(如GitHub Actions),实现源码拉取、编译、测试、打包全流程自动化。
3. 提交至鸿蒙社区
将移植成果提交至 OpenHarmonyPCDeveloper社区,推动生态共建。
五、总结
通过本文方案,开发者可快速将Linux平台开源库(如libogg、libvorbis等)移植至鸿蒙PC平台。关键在于:
- 正确配置交叉编译工具链,确保生成目标码兼容鸿蒙指令集与ABI。
- 合理使用CMake参数,适配鸿蒙的系统特性(如musl libc)。
- 遵循鸿蒙软件包规范,生成标准化交付件。
附录