使用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
相关产品推荐
相关产品推荐

