鸿蒙PC平台三方库移植实战:以libogg库移植为例(附完整移植流程与工具链配置)

文章目录

        • [前言 鸿蒙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开发需使用专用的交叉编译工具链 ,关于环境的搭建,参见猫哥的上一篇博文:

鸿蒙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平台。关键在于:

  1. 正确配置交叉编译工具链,确保生成目标码兼容鸿蒙指令集与ABI。
  2. 合理使用CMake参数,适配鸿蒙的系统特性(如musl libc)。
  3. 遵循鸿蒙软件包规范,生成标准化交付件。

附录

相关推荐
爱笑的眼睛112 小时前
深入理解HarmonyOS通知渠道与优先级设置:从基础到高级实践
华为·harmonyos
夏文强6 小时前
HarmonyOS开发者认证练习题-判断题
华为·harmonyos
Kisang.6 小时前
【HarmonyOS】ArkTS的多线程并发(下)——线程间通信对象的传递
华为·typescript·harmonyos·鸿蒙
柒儿吖11 小时前
Qt for HarmonyOS 3D图片轮播组件开源鸿蒙开发实战
qt·3d·harmonyos
fuze233311 小时前
解决在虚拟机的ensp中启动路由器,卡0%且出现虚拟机卡死的方法
网络·华为·ensp
爱笑的眼睛1114 小时前
HarmonyOS分布式输入法开发:实现多设备无缝输入体验
华为·harmonyos
爱笑的眼睛1115 小时前
深入HarmonyOS打印服务:从基础到高级应用开发
华为·harmonyos
鸿蒙小白龙18 小时前
OpenHarmony内核开发实战手册:编译构建、HCK框架与性能优化
harmonyos·鸿蒙·鸿蒙系统·open harmony
穆雄雄18 小时前
Rust 程序适配 OpenHarmony 实践:以 sd 工具为例
开发语言·rust·harmonyos