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

使用Emscripten编译FFmpeg为Wasm时遇重复符号错误求助

解决FFmpeg WebAssembly集成中的重复符号链接错误

我正尝试将FFmpeg直接集成到WebAssembly项目中,参考项目可编译FFmpeg并生成带JS绑定的Wasm,但我需要生成包含FFmpeg的独立Wasm文件,计划用CMake结合Docker构建,却在链接FFmpeg时遇到重复符号错误:

wasm-ld: error: duplicate symbol: emscripten_compute_dom_pk_code
>>> defined in /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/pic/libhtml5.a(dom_pk_codes.o)
>>> defined in /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/pic/libhtml5.a(dom_pk_codes.o)

wasm-ld: error: duplicate symbol: emscripten_dom_pk_code_to_string
>>> defined in /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/pic/libhtml5.a(dom_pk_codes.o)
>>> defined in /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/pic/libhtml5.a(dom_pk_codes.o)

wasm-ld: error: duplicate symbol: emscripten_dom_vk_to_string
>>> defined in /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/pic/libhtml5.a(key_codes.o)
>>> defined in /emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/pic/libhtml5.a(key_codes.o)

从错误信息判断,libhtml5.a中的符号被重复定义,根源是该库被重复链接。以下是针对性解决方案:


解决方案

1. 移除显式的-lhtml5链接选项

Emscripten在启用SDL2、WebGPU等特性时会自动链接必要的系统库,显式添加-lhtml5会导致重复链接。修改CMakeLists.txt中的target_link_options,删除-lhtml5参数:

target_link_options(${PROJECT_NAME} PUBLIC --shell-file ./src/index.html -gsource-map -v -sMAIN_MODULE=1 -sUSE_WEBGPU=1 -sNO_FILESYSTEM=1 -sASSERTIONS=1 -sMALLOC=emmalloc -sALLOW_MEMORY_GROWTH=1 -pthread --closure=1 -static-libstdc++ -std=c++17 -fsanitize=undefined)

2. 统一FFmpeg与主项目的编译模式

Dockerfile中编译FFmpeg和x264时使用了-sSIDE_MODULE=1,但主项目设置了-sMAIN_MODULE=1,两者模式不匹配会导致链接冲突。需统一为MAIN_MODULE模式:

  • 修改x264编译的extra-cflags:
    --extra-cflags="-s USE_PTHREADS=1 -s MAIN_MODULE=1"
    
  • 修改FFmpeg编译的CFLAGS和LDFLAGS:
    ARG CFLAGS="-s USE_PTHREADS=1 -O3 -I${PREFIX}/include -s MAIN_MODULE=1"
    ARG LDFLAGS="$CFLAGS -L${PREFIX}/lib -s INITIAL_MEMORY=33554432"
    

3. 临时应急:强制忽略重复符号(不推荐)

如果上述方法无效,可添加链接器选项强制忽略重复符号,但可能引发未定义行为,仅作为临时方案:

target_link_options(${PROJECT_NAME} PUBLIC ... -Wl,--allow-multiple-definition)

4. 清理缓存重新构建

清理Emscripten缓存和CMake构建目录,避免旧库文件残留:

rm -rf CMakeCache.txt CMakeFiles/
emcc --clear-cache

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 19:38:12