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

Ubuntu22.04编译带专有编解码器的QtWebEngine5.15.10报错

QtWebEngine 5.15.10 开启专有编解码器编译失败问题

问题背景

我基于QtWebEngine开发应用,业务需要支持H264编解码器。受专利限制QtWebEngine默认不集成这类专有编解码器,因此我选择从源码编译开启支持。由于无法使用Qt6版本的QtWebEngine,我选用Qt5分支最新版本5.15.10,在Ubuntu 22.04系统上执行以下编译操作:

# 安装依赖
sudo apt install gperf perl flex bison python2 libnss3-dev qtdeclarative5-private-dev
sudo apt install libdrm-dev libxcomposite-dev libxcomposite1 libnx-x11-dev libxkbfile-dev libxtst-dev libxdamage-dev  libxdamage1 libxrandr-dev libxrandr2 libxkbfile-dev libxkbfile1 libx11-xcb-dev

# 获取源码
git clone -b 5.15.10 https://github.com/qt/qtwebengine.git
cd qtwebengine
git submodule update --init --recursive

# 检查Python和g++版本
python --version
> Python 2.7.18
g++ --version
> g++ (Ubuntu 11.2.0-19ubuntu1) 11.2.0

# 创建构建目录编译
mkdir build
cd build
qmake .. -- -proprietary-codecs
make -j4 -l4

编译流程跑完大部分源码构建后报错,报错信息如下:

[16150/25745] /usr/bin/g++ -MMD -MF obj/third_party/webrtc/modules/congestion_controller/rtp/control_handler/control_handler.o.d -DUSE_UDEV -DUSE_AURA=1 -DUSE_NSS_CERTS=1 -DUSE_OZONE=1 -DOFFICIAL_BUILD -DTOOLKIT_QT -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DNO_UNWIND_TABLES -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -DNDEBUG -DNVALGRIND -DDYNAMIC_ANNOTATIONS_ENABLED=0 -DWEBRTC_ENABLE_PROTOBUF=1 -DRTC_ENABLE_VP9 -DHAVE_SCTP -DENABLE_EXTERNAL_AUTH -DWEBRTC_USE_H264 -DHAVE_WEBRTC_VIDEO -DLOGGING_INSIDE_WEBRTC -DWEBRTC_LIBRARY_IMPL -DWEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0 -DWEBRTC_CHROMIUM_BUILD -DWEBRTC_POSIX -DWEBRTC_LINUX -DABSL_ALLOCATOR_NOTHROW=1 -DNO_MAIN_THREAD_WRAPPING -Igen -I../../../../src/3rdparty/chromium -I../../../../src/3rdparty/chromium/third_party/webrtc_overrides -I../../../../src/3rdparty/chromium/third_party/webrtc -Igen/third_party/webrtc -I../../../../src/3rdparty/chromium/third_party/abseil-cpp -I../../../../src/3rdparty/chromium/third_party/perfetto/include -Igen/third_party/perfetto/build_config -Igen/third_party/perfetto -Igen -I../../../../src/3rdparty/chromium/third_party/libyuv/include -Igen -fno-strict-aliasing --param=ssp-buffer-size=4 -fstack-protector -fno-unwind-tables -fno-asynchronous-unwind-tables -fPIC -pipe -pthread -m64 -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -Wno-unused-local-typedefs -Wno-maybe-uninitialized -Wno-deprecated-declarations -fno-delete-null-pointer-checks -Wno-comments -Wno-packed-not-aligned -Wno-dangling-else -Wno-missing-field-initializers -Wno-unused-parameter -O2 -fno-ident -fdata-sections -ffunction-sections -fno-omit-frame-pointer -g0 -fvisibility=hidden -std=gnu++14 -Wno-narrowing -Wno-class-memaccess -Wno-attributes -Wno-class-memaccess -Wno-subobject-linkage -Wno-invalid-offsetof -Wno-return-type -Wno-deprecated-copy -fno-exceptions -fno-rtti -fvisibility-inlines-hidden -c ../../../../src/3rdparty/chromium/third_party/webrtc/modules/congestion_controller/rtp/control_handler.cc -o obj/third_party/webrtc/modules/congestion_controller/rtp/control_handler/control_handler.o
ninja: build stopped: subcommand failed.
make[3]: *** [Makefile.gn_run:436: run_ninja] Error 1
make[3]: Leaving directory '/home/max/Documents/qtwebengine/build/src/core'
make[2]: *** [Makefile:82: sub-gn_run-pro-make_first] Error 2
make[2]: Leaving directory '/home/max/Documents/qtwebengine/build/src/core'
make[1]: *** [Makefile:80: sub-core-make_first] Error 2
make[1]: Leaving directory '/home/max/Documents/qtwebengine/build/src'
make: *** [Makefile:49: sub-src-make_first] Error 2

我尝试手动执行报错里打印的g++编译命令,执行前先切换到对应目录:

cd src/core/release 

手动执行后该文件可以成功编译,因此无法确定是否是这个文件导致的构建问题。我设备配备24GB内存,编译时通过htop观测到内存占用最高不超过8GB,执行sudo dmesg查看系统日志也没有OOM相关报错。检索了大量技术资料和社区论坛都没找到对应解决方案。


解决方案

该报错属于ninja并行构建的典型误导性报错,日志最后打印的编译命令不是真正失败的任务,无需纠结control_handler.cc的编译问题,按以下步骤排查修复:

  • 先修正配置参数,清空构建目录重新配置
    当前传的-proprietary-codecs参数格式不对,Qt 5.15.10的QtWebEngine正确的专有编解码器开启方式是给qmake传对应配置项,不要直接给gn传短参数。先删除之前的build目录重新创建,执行配置命令:
    qmake ../qtwebengine.pro WEBENGINE_CONFIG+=use_proprietary_codecs QMAKE_CXXFLAGS+="-Wno-error=array-bounds -Wno-error=stringop-overflow"
    
    加的两个编译选项是为了规避Ubuntu 22.04自带的GCC 11对QtWebEngine内嵌老版本Chromium代码的误报,这些警告在老代码里会被当成错误终止编译。
  • 限制内层ninja的并行数,避免竞态和资源抢占
    外层make加的-j4参数不会传递给内层ninja,Qt的构建脚本调用ninja时默认会用CPU逻辑核心数开并行,容易出现生成头文件的任务没跑完、就开始编译依赖该头文件的源码的竞态问题,这也是手动单独编译那个文件能过的核心原因。执行编译时用以下命令:
    NINJAFLAGS="-j4" make -j4
    
  • 如果还是报错,往上翻编译日志找真正的错误点
    ninja并行构建时,某个任务失败后不会立刻终止,会等所有正在运行的编译任务跑完才退出,最后打印的那条g++命令只是最后一个跑完的正常任务,不是失败的那个。重新编译时把日志输出到文件方便检索:
    NINJAFLAGS="-j2" make -j2 2>&1 | tee build.log
    
    编译失败后直接在build.log里搜error:字段,就能定位到真正的报错源码位置,不要看最后几行的命令。
  • 补充缺失的依赖,规避环境问题
    Ubuntu 22.04编译QtWebEngine 5.15.10还需要安装几个缺失的依赖,提前装上避免后续报错:
    sudo apt install nodejs llvm-dev libclang-dev libpipewire-0.3-dev libevent-dev libjsoncpp-dev
    
    注意要保证系统默认的python命令指向python2,如果装完依赖后python被切到python3,执行sudo update-alternatives --config python选python2.7即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:15:37