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

下面是我自己写的构建脚本
使用的是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编译成功生成

#!/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最后的错误如下

更多关于HarmonyOS鸿蒙Next中ffmpeg3.2.2编译失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html
–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)配置不正确。
主要问题分析:
-
错误的链接器 (
LD):你设置的export LD=$TOOLCHAIN/bin/lld-link是不正确的。lld-link是用于链接 Windows PE 格式 可执行文件/库的链接器,适用于*-windows-msvc目标。- HarmonyOS (Ohos) 的目标系统是 Linux(使用 musl libc),其可执行文件和共享库格式是 ELF。因此,你需要使用适用于 ELF 格式的链接器。
-
次要问题:环境变量拼写错误:
export RANDLIB=$TOOLCHAIN/bin/llvm-ranlib应为export RANLIB=$TOOLCHAIN/bin/llvm-ranlib。configure脚本查找的是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.lld或aarch64-linux-ohos-ld),并传递必要的系统库和搜索路径。 - 设置正确的 ELF 文件头和目标平台属性。
直接将 LD 指向 lld-link 会绕过所有这些针对 Ohos 目标的定制,导致链接器尝试创建错误的文件格式(PE vs ELF),并找不到正确的 C 运行时库,从而引发你日志中看到的 -lc 等链接错误。
修改后建议:
- 应用上述修改。
- 清理之前的配置缓存:
make distclean或删除config.log、config.mak等文件。 - 重新运行你的构建脚本。
这样配置后,configure 应该能通过,并生成正确的 config.mak 文件用于后续的 make 编译。

