You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用em++编译含FFmpeg库的C++代码到WebAssembly时遇文件类型错误

解决FFmpeg编译WebAssembly时的wasm-ld-13: unknown file type: demux.o错误

问题背景

编译FFmpeg 8.0为WebAssembly时触发链接错误,具体报错:wasm-ld-13: error: unknown file type: demux.o。

使用的FFmpeg配置及安装命令:

emconfigure ./configure \
  --prefix=$(pwd)/installed \
  --enable-cross-compile \
  --target-os=none \
  --arch=x86 \
  --cpu=generic \
  --disable-x86asm \
  --disable-inline-asm \
  --disable-programs \
  --disable-doc \
  --disable-debug \
  --disable-network \
  --disable-autodetect

emmake make -j$(nproc)
emmake make install

编译C++代码的命令:

em++ main.cpp -o output.html \
  -I/home/example/ffmpeg-8.0/installed/include \
  -L/home/example/ffmpeg-8.0/installed/lib \
  -lavcodec -lavformat -lavutil

错误输出:

wasm-ld-13: error: unknown file type: demux.o
em++: error: '/usr/bin/wasm-ld-13 -o output.wasm /tmp/emscripten_temp_sx9gslhu/main_0.o -L/home/example/ffmpeg-8.0/installed/lib /home/example/ffmpeg-8.0/installed/lib/libavcodec.a /home/example/ffmpeg-8.0/installed/lib/libavformat.a /home/example/ffmpeg-8.0/installed/lib/libavutil.a -L/usr/share/emscripten/cache/sysroot/lib/wasm32-emscripten -lGL -lal -lhtml5 -lstubs-debug -lnoexit -lc-debug -ldlmalloc -lcompiler_rt -lc++-noexcept -lc++abi-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --import-undefined --strip-debug --export-if-defined=main --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__stdio_exit --export=emscripten_stack_get_end --export=emscripten_stack_get_free --export=emscripten_stack_get_base --export=emscripten_stack_init --export=stackSave --export=stackRestore --export=stackAlloc --export=__wasm_call_ctors --export=__errno_location --export-table -z stack-size=5242880 --initial-memory=16777216 --no-entry --max-memory=16777216 --global-base=1024' failed (returned 1)

环境:Ubuntu系统,em++版本emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.5 (),要求不使用Docker解决。

解决步骤

1. 重新用Emscripten工具链编译FFmpeg

报错核心原因是demux.o不是WebAssembly格式的目标文件,说明FFmpeg编译时未正确调用Emscripten工具链。

  • 清理旧编译产物:
    make distclean
    rm -rf installed
    
  • 激活Emscripten环境变量(替换为你的emsdk实际路径):
    source /path/to/emsdk/emsdk_env.sh
    
  • 重新配置FFmpeg,明确指定Emscripten工具链:
    emconfigure ./configure \
      --prefix=$(pwd)/installed \
      --enable-cross-compile \
      --target-os=none \
      --arch=wasm32 \
      --cpu=generic \
      --disable-x86asm \
      --disable-inline-asm \
      --disable-programs \
      --disable-doc \
      --disable-debug \
      --disable-network \
      --disable-autodetect \
      --cc=emcc \
      --cxx=em++ \
      --ar=emar \
      --ranlib=emranlib \
      --nm=emnm \
      --disable-shared \
      --enable-static
    
    这里将--arch=x86改为--arch=wasm32匹配目标架构,同时强制静态编译避免动态库问题。
  • 重新编译安装:
    emmake make -j$(nproc)
    emmake make install
    

2. 确保Emscripten工具链优先级高于系统版本

系统中可能存在其他版本的wasm-ld,导致链接时调用错误版本:

  • 临时提升Emscripten工具链优先级:
    export PATH=$(dirname $(which emcc)):$PATH
    
  • 重新执行你的C++编译命令。

3. 验证静态库格式

检查编译出的FFmpeg静态库是否为WebAssembly格式:

ar -x /home/example/ffmpeg-8.0/installed/lib/libavformat.a demux.o
file demux.o

若输出不是WebAssembly (wasm) object file,说明静态库编译错误,需回到步骤1重新编译。

内容的提问来源于stack exchange,提问作者ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:13:16