首页 > 解决方案 > 如何修复从 Linux 上的 Docker 启动的 Qt5 (QML) GUI 中的 libGL 错误?

问题描述

我正在尝试在本地 Ubuntu (20.04) 主机上运行的 docker (FROM ubuntu:20.04) 中运行 Qt5 应用程序(使用 QML 和 cpp main)。应用程序失败并显示:

#: ./src/qt_files/qt_gui
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
QGLXContext: Failed to create dummy context
Failed to create OpenGL context for format QSurfaceFormat(version 2.0, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 24, redBufferSize -1, greenBufferSize -1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile  QSurfaceFormat::NoProfile) 
Aborted (core dumped)

能够毫无问题地在本机运行该应用程序,但未能使其在 docker 中运行

我使用的 docker run 命令是:

docker run -it --rm --privileged -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME:/myhome -v /dev/:/dev/ --name qt-dev myqtdocker /bin/bash

我还使用xhost local:root并确认我可以从 docker 运行其他 x11 应用程序。

比较 ldd 输出似乎表明应用程序在 docker 和本机中都链接到相同的库。

应该注意的是,是的,该机器包含一个专用的 NVIDIA GPU,但我故意不将其用作任一环境中的运行时。(与 nvidia-smi 确认)。尽管我可能对驱动程序的加载方式有误,但欢迎提出任何建议。提前感谢您的帮助。

标签: linuxdockerqtubuntuqml

解决方案


一种解决方法是添加 -e QT_QUICK_BACKEND=software到您的运行命令或ENV QT_QUICK_BACKEND=software您的 docker 文件中。

我仍在寻找一种使用硬件模式运行它的方法,因为在软件模式下地图折线存在一些问题。


推荐阅读