当前位置: 首页 > news >正文

鸿蒙PC生态实践:LAME 音频编码库移植与工程化指南

本文详细介绍了如何针对 OpenHarmony PC 平台,使用 CMake 构建系统交叉编译 LAME MP3 编码库。文章聚焦于解决标准库缺失、架构不匹配等核心移植难题,并提供了适配鸿蒙PC开发环境的工程化 CMakeLists.txt 方案。

前言:鸿蒙PC生态的拓展与三方库移植意义

随着 HarmonyOS 正式进军 PC 领域,构建完善的软件生态成为关键。由于鸿蒙 PC 版的底层基于 OpenHarmony 与 Linux 内核的混合架构,现有 Linux/Windows 平台的开源库需要针对鸿蒙 PC 进行交叉编译与系统级适配。本文将以开源音频库 LAME 为例,详细介绍如何在鸿蒙 PC 平台上完成三方库的移植,并提供可复用的工程化方案。

LAME是目前非常优秀的一种MP3编码引擎,在业界,转码成MP3格式的音频文件时,最常用的编码器就是LAME库。当到达320Kbit/s以上时,LAME编码出来的音频质量几乎可以和CD的音质相媲美,并且还能保证整个音频文件的体积非常小,因此若要在移动端平台上编码MP3文件,使用LAME便成为唯一的选择。同时该库也是ffmpeg的依赖库之一。

一、移植工具链环境搭建

鸿蒙 PC 开发需使用专用的交叉编译工具链。关于环境的搭建,参见猫哥的上一篇博文:《鸿蒙PC生态三方软件移植:开发环境搭建及三方库移植指南》。

虽然官方提供了示例项目工程和 build.sh 脚本,但这些方案适合批量构建多个库,不方便单独调试。我们采用更灵活的 exports.sh 脚本来配置独立的开发环境。

  1. 配置 SDK 路径与基础工具链

在项目目录下创建 exports.sh 文件,声明 SDK 路径与编译工具。
根据你实际的改下配置:

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.cmakeexport WORK_ROOT=${PWD}
export ARCHIVE_PATH=${WORK_ROOT}/output
export COMM_DEP_PATH=${WORK_ROOT}/deps_installexport HNP_PUBLIC_PATH=${HNP_PERFIX}/data/service/hnp/
export MAKE_QUITE_PARAM=" -s "
export CONFIGURE_QUITE_PARAM=" --quiet "export TARGET_PLATFORM=aarch64-linux-ohosexport CFLAGS="-fPIC -D__MUSL__=1 -D__OHOS__ -fstack-protector-strong --target=${TARGET_PLATFORM} --ld-path=${LD}  --sysroot=${SYSROOT}"
export CXXFLAGS="${CFLAGS} "
export LD_LIBRARY_PATH=${SYSROOT}/usr/lib:${LD_LIBRARY_PATH}
export LDFLAGS="${LDFLAGS} --ld-path=${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 激活环境。

  1. CMake 工具链配置

鸿蒙 SDK 提供专用的 ohos.toolchain.cmake 文件,用于指导 CMake 的交叉编译行为。该配置已包含在上述 exports.sh 脚本中。

二、LAME 库移植实战

LAME(Lame Aint an MP3 Encoder)是一个高质量的开源 MP3 音频编码器。LAME 原始的构建系统依赖于 configure 脚本生成 config.h 文件和 Makefiles,这在鸿蒙交叉编译环境中容易出现兼容性问题。因此,我们选择使用 CMake 构建系统,并手动解决移植过程中遇到的关键问题。

lame源码地址:https://sourceforge.net/projects/lame/

  1. 移植遇到的主要问题与解决思路
    手动使用 CMake 构建时,跳过了 LAME 原有的 configure 脚本所做的系统类型检查,导致以下错误:
    链接错误:cannot find crti.o 或 file in wrong format (EM: 183),通常是由于工具链未正确配置 sysroot 或架构不匹配导致。
    编译错误:unknown type name ‘ieee754_float32_t’ 或 undeclared identifier ‘INT_MAX’ 等。
    解决思路:
    配置 Sysroot:通过 exports.sh 正确设置 CMAKE_SYSROOT 和 TARGET_PLATFORM,确保编译器能找到标准的 C 库头文件。
    适配类型定义:在 CMake 中手动定义 ieee754_float32_t 类型别名,模拟 config.h 的功能。
  2. 核心 CMake 构建脚本 (CMakeLists.txt)
    将以下内容保存为 LAME 源码根目录下的 CMakeLists.txt:

控制是否构建前端可执行文件 (lame),默认禁用以简化移植:

option(BUILD_FRONTEND "Build the LAME frontend executable (lame)" OFF)set(LAME_VERSION_MAJOR 3)
set(LAME_VERSION_MINOR 100)
set(LAME_VERSION "${LAME_VERSION_MAJOR}.${LAME_VERSION_MINOR}")

包含头文件路径

include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include""${CMAKE_CURRENT_SOURCE_DIR}/libmp3lame"
)

定义源代码文件列表

file(GLOB_RECURSE LAME_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/libmp3lame/*.c")

— 解决编译错误的关键部分 —

  1. 解决 ‘ieee754_float32_t’ unknown type name 错误,手动定义为 float
    add_definitions(-Dieee754_float32_t=float)

注意:此脚本依赖于外部工具链配置(如 exports.sh 中的 --sysroot)来查找标准库头文件。

添加库目标 (构建为动态库 SHARED,适配鸿蒙动态链接机制)

add_library(mp3lame SHARED ${LAME_SOURCES})set_target_properties(mp3lame PROPERTIESVERSION ${LAME_VERSION}SOVERSION ${LAME_VERSION_MAJOR}PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/include/lame.h"
)

定义安装规则

install(TARGETS mp3lameRUNTIME DESTINATION binLIBRARY DESTINATION libARCHIVE DESTINATION libPUBLIC_HEADER DESTINATION include
)

根据选项决定是否编译前端

if(BUILD_FRONTEND)message(STATUS "Building LAME frontend executable (lame)")# ... (此处省略前端构建代码) ...
else()message(STATUS "Frontend executable build disabled by option BUILD_FRONTEND")
endif()
  1. 开始执行编译
    确保您已经按照第一节配置了 exports.sh 并激活环境。
  2. 激活环境
source exports.sh
  1. 进入 LAME 源码目录,创建并进入 build 目录
cd /path/to/lame/source
mkdir build
cd build
  1. 运行 CMake,指定源码目录(…),并使用鸿蒙专用的工具链文件
    CMAKE 环境变量已经在 exports.sh 中定义
${CMAKE} .. -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} -DBUILD_SHARED_LIBS=ON
  1. 编译
make -j$(nproc)

完整的cmake脚本

CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.12)
project(LAME C)# --- 添加一个选项来控制是否构建前端 ---
# 默认开启 (ON),如果你想默认禁用,可以改为 OFF
option(BUILD_FRONTEND "Build the LAME frontend executable (lame)" OFF)set(LAME_VERSION_MAJOR 3)
set(LAME_VERSION_MINOR 100)
set(LAME_VERSION "${LAME_VERSION_MAJOR}.${LAME_VERSION_MINOR}")# 包含头文件路径
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include""${CMAKE_CURRENT_SOURCE_DIR}/libmp3lame"
)# 定义源代码文件列表
file(GLOB_RECURSE LAME_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/libmp3lame/*.c")# --- 解决编译错误的关键部分 ---# 1. 解决 'ieee754_float32_t' unknown type name 错误
add_definitions(-Dieee754_float32_t=float)# 添加库目标
add_library(mp3lame SHARED ${LAME_SOURCES})
# 将列表中的每个项目作为单独的选项传递
target_compile_options(mp3lame PRIVATE ${LAME_REQUIRED_INCLUDES})set_target_properties(mp3lame PROPERTIESVERSION ${LAME_VERSION}SOVERSION ${LAME_VERSION_MAJOR}PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/include/lame.h"
)install(TARGETS mp3lameRUNTIME DESTINATION binLIBRARY DESTINATION libARCHIVE DESTINATION libPUBLIC_HEADER DESTINATION include
)# --- 使用 if 语句根据选项决定是否编译前端 ---
if(BUILD_FRONTEND)message(STATUS "Building LAME frontend executable (lame)")file(GLOB_RECURSE FRONTEND_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/frontend/*.c")add_executable(lame ${FRONTEND_SOURCES})target_link_libraries(lame mp3lame)target_compile_options(lame PRIVATE ${LAME_REQUIRED_INCLUDES})install(TARGETS lame RUNTIME DESTINATION bin)
else()message(STATUS "Frontend executable build disabled by option BUILD_FRONTEND")
endif()

三、编译注意事项

如果待移植的项目原生支持 CMake,强烈建议直接使用 CMake 进行构建,可以省去大量适配 configure 脚本和 Makefile 的麻烦。如本文所示,通过适配 CMake,可以高效地解决鸿蒙 PC 平台移植中遇到的标准库兼容性和架构配置问题。

build_os.sh脚本:

export LAME_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/lame.org/lame_3.100#make clean${CMAKE} \-DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} \-DCMAKE_BUILD_TYPE=Release \-DBUILD_SHARED_LIBS=ON \-DCMAKE_INSTALL_PREFIX=${LAME_INSTALL_HNP_PATH}\-DCMAKE_SYSROOT="${SYSROOT}" make VERBOSE=1 -j$(nproc)
make installcp hnp.json ${LAME_INSTALL_HNP_PATH}/
pushd ${LAME_INSTALL_HNP_PATH}/../${HNP_TOOL} pack -i ${LAME_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/tar -zvcf ${ARCHIVE_PATH}/ohos_lame_3.100.tar.gz lame_3.100/
popd

编译成功截图:

在这里插入图片描述
如果使用原始的configure脚本形式,编译莫名报错,这个报错原因,至今未找到答案。
原来的build_ohos.sh脚本如下:

export LAME_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/lame.org/lame_3.100#make clean./configure  --host=aarch64-linux-musl \--target=aarch64-linux-musl \--enable-shared \--disable-static \--prefix=${LAME_INSTALL_HNP_PATH} make VERBOSE=1 -j$(nproc)
make installcp hnp.json ${LAME_INSTALL_HNP_PATH}/
pushd ${LAME_INSTALL_HNP_PATH}/../${HNP_TOOL} pack -i ${LAME_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/tar -zvcf ${ARCHIVE_PATH}/ohos_lame_3.100.tar.gz lame_3.100/
popd

在这里插入图片描述

最后实在没办法了,给lame库写了个cmake的脚本,使用cmake的方式搞定了。
如果其他小伙伴有使用configure脚本生成makefile形式编译成功的,欢迎留言交流下哈。

其他资源

  • https://zhuanlan.zhihu.com/p/147945148

  • 鸿蒙PC开发工具链下载

http://www.dtcms.com/a/613953.html

相关文章:

  • 可以上传视频的网站建设中国科技成就手抄报
  • Redis_12_持久化(1)
  • stm32f4点灯
  • 自己做网站详细步骤电脑如何安装免费wordpress
  • 前端微前端样式隔离,CSS-in-JS方案
  • 【go.sixue.work】2.3 面向对象:结构体里的 Tag 用法
  • Halcon ROI 与图像仿射变换笔记
  • 软件设计师(软考中级)公式速记笔记
  • 电商网站开发过程手机推广app
  • 18.HTTP协议(三)
  • 产科信息管理系统,智慧产科源码,支持与医院HIS、EMR系统及国家级妇幼平台的数据对接
  • 在VPython中使用向量计算3D物体移动
  • R语言在线编译器 | 提供方便快捷的数据分析工具
  • YOLOv8多场景人物识别定位与改进ASF-DySample算法详解
  • 网网站基础建设优化知识成都感染人数最新消息
  • 电商网站建设实训要求威海好的网站建设公司哪家好
  • Ionic 安装指南
  • kubernetes 导入镜像tar包
  • 南通网站开发上海网站搭建
  • oracle 物化视图设置自动更新日志
  • Java测试题
  • YOLO v11的学习记录(五) 使用自定义数据从头训练一个实例分割的模型
  • 大模型Agent工作流设计模式深度解析:从ReAct到ReWOO的实践演进
  • redis的配置windows
  • 漯河英文网站建设秦皇岛陵县网站建设
  • HTML5+CSS3+JS小实例:螺旋鼠标轨迹
  • 长沙市云网站建设大型电商网站开发方案
  • 从一到无穷大 #57:Snowflake的剪枝方案
  • 网页网站的区别是什么最适合seo的wordpress主题
  • 深入理解 OverlayFS:用分层的方式重新组织 Linux 文件系统