HarmonyOS鸿蒙Next中ffmpeg3.2.2编译失败

HarmonyOS鸿蒙Next中ffmpeg3.2.2编译失败 我参考官网提供的ffmpeg编译脚本,然后自己写了一个编译脚本在configure构建时一直失败,这个脚本之前在安卓NDK工具链都是可以的,请帮忙看看是什么原因 cke_318.png

下面是我自己写的构建脚本

使用的是commandline-tools-linux-x64-5.0.3.906

开发环境使用的是fedora 43

Linux localhost.localdomain 6.17.1-300.fc43.x86_64 #1 SMP PREEMPT_DYNAMIC Mon Oct 6 15:37:21 UTC 2025 x86_64 GNU/Linux

ffmpeg依赖的opus,我已经使用aarch64-unknown-linux-ohos-clang编译成功生成 cke_165470.png

#!/bin/bash

SYSROOT=/command-line-tools/sdk/default/openharmony/native/sysroot
TOOLCHAIN=/command-line-tools/sdk/default/openharmony/native/llvm
HEADRPATH=/wallet/ohos

function build_one
{
    export PKG_CONFIG_LIBDIR=/wallet/ohos/lib
    export PKG_CONFIG_PATH=/wallet/ohos/lib/pkgconfig
    export CC=$TOOLCHAIN/bin/aarch64-unknown-linux-ohos-clang
    export CXX=$TOOLCHAIN/bin/aarch64-unknown-linux-ohos-clang++
    export NM=$TOOLCHAIN/bin/aarch64-linux-ohos-nm
    export STRIP=$TOOLCHAIN/bin/aarch64-linux-ohos-strip
    export RANDLIB=$TOOLCHAIN/bin/llvm-ranlib
    export AS=$TOOLCHAIN/bin/llvm-as
    export AR=$TOOLCHAIN/bin/llvm-ar
    export LD=$TOOLCHAIN/bin/lld-link
    export ldflags="-fPIC  -L/command-line-tools/sdk/default/openharmony/native/sysroot/usr/lib/aarch64-linux-ohos -L$HEADRPATH/lib "
./configure \
    --prefix=/wallet/ohos \
    --enable-shared \
    --disable-static \
    --disable-programs\
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-doc \
    --disable-htmlpages\
    --disable-manpages \
    --disable-podpages \
    --disable-txtpages \
    --disable-everything \
    --enable-swresample \
    --disable-debug \
    --disable-symver \
--disable-encoders \
--disable-decoders \
 --enable-libopus \
 --enable-encoder=adpcm_g722 \
 --enable-encoder=adpcm_g726 \
 --enable-encoder=adpcm_ima_qt \
 --enable-encoder=adpcm_ima_wav \
 --enable-encoder=adpcm_ms \
 --enable-encoder=adpcm_swf \
 --enable-encoder=adpcm_yamaha \
        --enable-encoder=rawvideo \
        --enable-encoder=mjpeg \
        --enable-encoder=mpeg4 \
        --enable-encoder=msmpeg4v2 \
        --enable-encoder=msmpeg4v3 \
        --enable-encoder=aac \
        --enable-encoder=libopus \
        --enable-encoder=mp2 \
        --enable-encoder=libvo_amrwbenc \
        --enable-decoder=rawvideo \
        --enable-decoder=jacosub \
        --enable-decoder=dvdsub \
        --enable-decoder=dvbsub \
        --enable-decoder=subviewer \
        --enable-decoder=mjpeg \
        --enable-decoder=h263 \
        --enable-decoder=mpegvideo \
        --enable-decoder=mpeg1video \
        --enable-decoder=mpeg2video \
        --enable-decoder=msmpeg4v2 \
        --enable-decoder=msmpeg4v3 \
        --enable-decoder=mpeg4 \
        --enable-decoder=h264 \
        --enable-decoder=hevc \
        --enable-decoder=vc1 \
        --enable-decoder=vp8 \
        --enable-decoder=vp9 \
        --enable-decoder=flv \
--enable-decoder=rv10 \
--enable-decoder=rv20 \
--enable-decoder=rv30 \
--enable-decoder=rv40 \
  --enable-decoder=wmv1 \
  --enable-decoder=wmv2 \
  --enable-decoder=wmv3 \
   --enable-decoder=wmv3image \
   --enable-decoder=wnv1 \
        --enable-decoder=amrwb \
        --enable-decoder=opus \
        --enable-decoder=libopus \
--enable-decoder=aac \
--enable-decoder=aac_at \
--enable-decoder=aac_fixed \
--enable-decoder=aac_latm \
--enable-decoder=cook \
--enable-decoder=flac \
--enable-decoder=ape \
--enable-decoder=vorbis \
--enable-decoder=mp2 \
--enable-decoder=mp3 \
--enable-decoder=wmalossless \
--enable-decoder=wmapro \
--enable-decoder=wmav1 \
--enable-decoder=wmav2 \
--enable-decoder=wmavoice \
--enable-decoder=adpcm_g722 \
--enable-decoder=adpcm_g726 \
--enable-decoder=adpcm_ima_wav \
--enable-decoder=libfdk_aac \
--enable-decoder=ac3 \
--enable-decoder=ac3_at \
--enable-decoder=ac3_fixed \
--disable-demuxers \
--enable-demuxer=aac \
--enable-demuxer=ape \
--enable-demuxer=flv \
--enable-demuxer=mp3 \
--enable-demuxer=flac \
--enable-demuxer=ape \
--enable-demuxer=ogg \
--enable-demuxer=asf \
--enable-demuxer=wav \
--enable-demuxer=xwma \
        --enable-demuxer=avi \
        --enable-demuxer=mov \
        --enable-demuxer=h264 \
        --enable-demuxer=hevc \
        --enable-demuxer=mpegvideo \
        --enable-demuxer=h263 \
        --enable-demuxer=mpegps \
        --enable-demuxer=mjpeg \
        --enable-demuxer=rtsp \
        --enable-demuxer=rtp \
        --enable-demuxer=hls \
        --enable-demuxer=matroska \
--enable-muxer=rtsp \
        --enable-muxer=opus \
        --enable-muxer=mp4 \
        --enable-muxer=mov \
        --enable-muxer=mjpeg \
        --enable-muxer=matroska \
        --enable-muxer=mp2 \
--enable-protocol=crypto \
        --enable-protocol=file \
        --enable-protocol=data \
        --enable-protocol=cache \
        --enable-protocol=rtp \
        --enable-protocol=tcp \
        --enable-protocol=udp \
        --enable-protocol=hls \
        --enable-protocol=http \
--disable-parsers \
--enable-parser=aac \
--enable-parser=opus \
--enable-parser=flac \
--enable-parser=aac_latm \
--enable-parser=mpegaudio \
--enable-parser=h264 \
--enable-libopus \
    --enable-gpl \
    --enable-nonfree \
    --enable-version3 \
--disable-cuda \
--disable-cuvid \
    --enable-asm \
    --enable-filter=scale \
    --enable-neon\
    --target-os=linux \
    --arch=aarch64 \
    --cc=${CC} \
    --ld=${CC}  \
    --strip=${STRIP}  \
    --host-cc="${CC}"  \
    --host-ld="${CC}"  \
    --host-os=linux \
    --host-ldflags="${ldflags} " \
    --sysroot=${SYSROOT} \
     --nm=${NM} \
  --ar=${AR} \
  --ranlib=${RANLIB}  \
    --extra-cflags="-fPIC -I$HEADRPATH/include  "
}

build_one

config.log最后的错误如下 cke_94337.png


更多关于HarmonyOS鸿蒙Next中ffmpeg3.2.2编译失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

–host-cc="${CC}"
–host-ld="${CC}"
改为 --host-cc=“gcc” \ --host-ld="gcc"试试

修复后代码:

#!/bin/bash
SYSROOT=/command-line-tools/sdk/default/openharmony/native/sysroot
TOOLCHAIN=/command-line-tools/sdk/default/openharmony/native/llvm
HEADRPATH=/wallet/ohos

function build_one
{
    export PKG_CONFIG_LIBDIR=/wallet/ohos/lib
    export PKG_CONFIG_PATH=/wallet/ohos/lib/pkgconfig
    
  
    OHOS_CFLAGS="-fPIC --target=aarch64-linux-ohos --sysroot=$SYSROOT -I$HEADRPATH/include"
    OHOS_LDFLAGS="-L$SYSROOT/usr/lib/aarch64-linux-ohos -L$HEADRPATH/lib"

    export CC=$TOOLCHAIN/bin/aarch64-unknown-linux-ohos-clang
    export CXX=$TOOLCHAIN/bin/aarch64-unknown-linux-ohos-clang++
    export NM=$TOOLCHAIN/bin/llvm-nm
    export STRIP=$TOOLCHAIN/bin/llvm-strip
    export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
    export AS=$TOOLCHAIN/bin/llvm-as
    export AR=$TOOLCHAIN/bin/llvm-ar
    export LD=$TOOLCHAIN/bin/ld.lld 

./configure \
    --prefix=/wallet/ohos \
    --enable-shared \
    --disable-static \
    --disable-programs \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-doc \
    --disable-htmlpages \
    --disable-manpages \
    --disable-podpages \
    --disable-txtpages \
    --disable-everything \
    --enable-swresample \
    --disable-debug \
    --disable-symver \
    --disable-encoders \
    --disable-decoders \
    --enable-libopus \
    --enable-encoder=adpcm_g722 \
    --enable-encoder=adpcm_g726 \
    --enable-encoder=adpcm_ima_qt \
    --enable-encoder=adpcm_ima_wav \
    --enable-encoder=adpcm_ms \
    --enable-encoder=adpcm_swf \
    --enable-encoder=adpcm_yamaha \
    --enable-encoder=rawvideo \
    --enable-encoder=mjpeg \
    --enable-encoder=mpeg4 \
    --enable-encoder=msmpeg4v2 \
    --enable-encoder=msmpeg4v3 \
    --enable-encoder=aac \
    --enable-encoder=libopus \
    --enable-encoder=mp2 \
    --enable-encoder=libvo_amrwbenc \
    --enable-decoder=rawvideo \
    --enable-decoder=jacosub \
    --enable-decoder=dvdsub \
    --enable-decoder=dvbsub \
    --enable-decoder=subviewer \
    --enable-decoder=mjpeg \
    --enable-decoder=h263 \
    --enable-decoder=mpegvideo \
    --enable-decoder=mpeg1video \
    --enable-decoder=mpeg2video \
    --enable-decoder=msmpeg4v2 \
    --enable-decoder=msmpeg4v3 \
    --enable-decoder=mpeg4 \
    --enable-decoder=h264 \
    --enable-decoder=hevc \
    --enable-decoder=vc1 \
    --enable-decoder=vp8 \
    --enable-decoder=vp9 \
    --enable-decoder=flv \
    --enable-decoder=rv10 \
    --enable-decoder=rv20 \
    --enable-decoder=rv30 \
    --enable-decoder=rv40 \
    --enable-decoder=wmv1 \
    --enable-decoder=wmv2 \
    --enable-decoder=wmv3 \
    --enable-decoder=wmv3image \
    --enable-decoder=wnv1 \
    --enable-decoder=amrwb \
    --enable-decoder=opus \
    --enable-decoder=libopus \
    --enable-decoder=aac \
    --enable-decoder=aac_at \
    --enable-decoder=aac_fixed \
    --enable-decoder=aac_latm \
    --enable-decoder=cook \
    --enable-decoder=flac \
    --enable-decoder=ape \
    --enable-decoder=vorbis \
    --enable-decoder=mp2 \
    --enable-decoder=mp3 \
    --enable-decoder=wmalossless \
    --enable-decoder=wmapro \
    --enable-decoder=wmav1 \
    --enable-decoder=wmav2 \
    --enable-decoder=wmavoice \
    --enable-decoder=adpcm_g722 \
    --enable-decoder=adpcm_g726 \
    --enable-decoder=adpcm_ima_wav \
    --enable-decoder=libfdk_aac \
    --enable-decoder=ac3 \
    --enable-decoder=ac3_at \
    --enable-decoder=ac3_fixed \
    --disable-demuxers \
    --enable-demuxer=aac \
    --enable-demuxer=ape \
    --enable-demuxer=flv \
    --enable-demuxer=mp3 \
    --enable-demuxer=flac \
    --enable-demuxer=ape \
    --enable-demuxer=ogg \
    --enable-demuxer=asf \
    --enable-demuxer=wav \
    --enable-demuxer=xwma \
    --enable-demuxer=avi \
    --enable-demuxer=mov \
    --enable-demuxer=h264 \
    --enable-demuxer=hevc \
    --enable-demuxer=mpegvideo \
    --enable-demuxer=h263 \
    --enable-demuxer=mpegps \
    --enable-demuxer=mjpeg \
    --enable-demuxer=rtsp \
    --enable-demuxer=rtp \
    --enable-demuxer=hls \
    --enable-demuxer=matroska \
    --enable-muxer=rtsp \
    --enable-muxer=opus \
    --enable-muxer=mp4 \
    --enable-muxer=mov \
    --enable-muxer=mjpeg \
    --enable-muxer=matroska \
    --enable-muxer=mp2 \
    --enable-protocol=crypto \
    --enable-protocol=file \
    --enable-protocol=data \
    --enable-protocol=cache \
    --enable-protocol=rtp \
    --enable-protocol=tcp \
    --enable-protocol=udp \
    --enable-protocol=hls \
    --enable-protocol=http \
    --disable-parsers \
    --enable-parser=aac \
    --enable-parser=opus \
    --enable-parser=flac \
    --enable-parser=aac_latm \
    --enable-parser=mpegaudio \
    --enable-parser=h264 \
    --enable-libopus \
    --enable-gpl \
    --enable-nonfree \
    --enable-version3 \
    --disable-cuda \
    --disable-cuvid \
    --enable-asm \
    --enable-filter=scale \
    --enable-neon \
    --target-os=linux \
    --arch=aarch64 \
    --sysroot=${SYSROOT} \
    --cc="${CC}" \
    --cxx="${CXX}" \
    --nm="${NM}" \
    --ar="${AR}" \
    --ranlib="${RANLIB}" \
    --strip="${STRIP}" \
    --extra-cflags="${OHOS_CFLAGS}" \
    --extra-ldflags="${OHOS_LDFLAGS}" \
    --host-cc="gcc" \
    --host-ld="gcc"
    
}

build_one

更多关于HarmonyOS鸿蒙Next中ffmpeg3.2.2编译失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中编译ffmpeg 3.2.2失败,主要原因在于该版本较旧,其构建脚本和代码可能未适配鸿蒙的编译工具链(如ArkTS/方舟编译器)和系统库。鸿蒙Next的NDK(Native Development Kit)环境、API接口及系统头文件路径与传统的Linux/Android环境存在差异。常见的具体错误可能包括:找不到特定的系统头文件(如linux/time.h)、不兼容的POSIX API或链接库缺失。你需要检查ffmpeg的configure配置,根据鸿蒙的文档调整交叉编译参数,例如指定正确的--sysroot--arch和工具链前缀。

从你提供的配置和错误日志来看,编译失败的核心原因是 链接器(Linker)配置不正确

主要问题分析:

  1. 错误的链接器 (LD):你设置的 export LD=$TOOLCHAIN/bin/lld-link 是不正确的。

    • lld-link 是用于链接 Windows PE 格式 可执行文件/库的链接器,适用于 *-windows-msvc 目标。
    • HarmonyOS (Ohos) 的目标系统是 Linux(使用 musl libc),其可执行文件和共享库格式是 ELF。因此,你需要使用适用于 ELF 格式的链接器。
  2. 次要问题:环境变量拼写错误export RANDLIB=$TOOLCHAIN/bin/llvm-ranlib 应为 export RANLIB=$TOOLCHAIN/bin/llvm-ranlibconfigure 脚本查找的是 RANLIB 变量。

解决方案:

修改你的构建脚本 build_one 函数中的相关行:

# 将链接器 LD 设置为 clang,由 clang 驱动正确的链接器(如 ld.lld 或系统链接器)
export LD=$TOOLCHAIN/bin/aarch64-unknown-linux-ohos-clang

# 修正 RANLIB 的变量名
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib

同时,在 configure 参数中,确保 --ld 也使用相同的编译器驱动:

--ld=${CC} \  # 这已经是正确的

原理说明: 在 HarmonyOS/OHOS 的 LLVM 工具链中,aarch64-unknown-linux-ohos-clang 是一个编译器驱动。它不仅负责编译,在链接阶段也会被调用。它会自动处理:

  • 选择正确的运行时库路径(如 libc.a, libm.a)。
  • 调用底层真正的链接器(例如 ld.lldaarch64-linux-ohos-ld),并传递必要的系统库和搜索路径。
  • 设置正确的 ELF 文件头和目标平台属性。

直接将 LD 指向 lld-link 会绕过所有这些针对 Ohos 目标的定制,导致链接器尝试创建错误的文件格式(PE vs ELF),并找不到正确的 C 运行时库,从而引发你日志中看到的 -lc 等链接错误。

修改后建议:

  1. 应用上述修改。
  2. 清理之前的配置缓存:make distclean 或删除 config.logconfig.mak 等文件。
  3. 重新运行你的构建脚本。

这样配置后,configure 应该能通过,并生成正确的 config.mak 文件用于后续的 make 编译。

回到顶部