WSL2 на Windows 11 (Ubuntu 20.04): не удается запустить приложения Qt, “не удалось подключиться к дисплею: :0”, модуль xcb обнаружен, но не загружен.

Вопрос или проблема

Приложения Qt работают из WSL, размещенного в терминале, но не из оконного WSL.

Я пытаюсь запустить приложение Qt, такое как xeyes, на WSL2 с Ubuntu 20.04 на Windows 11. Когда я запускаю его (xeyes, или Wireshark, или программное обеспечение, созданное Qt в моей компании), у меня возникает ошибка: Error: Can't open display: :0.

В зависимости от программного обеспечения ошибка может быть детализирована следующим образом:

user@PC:~$ wireshark
qt.qpa.xcb: не удалось подключиться к дисплею: :0
qt.qpa.plugin: Не удалось загрузить плагин платформы Qt "xcb" в "" , хотя он был найден

Для наглядности я начну строки кода следующим образом:

  • C:\Users\me> foo — это терминал Windows (CMD)
  • bash-5.0$ fight — это WSL, вызванный из терминала (в том же окне)
  • user@PC:~$ — это WSL, запущенный из Windows 11, с рабочего стола, в отдельном окне. Это должно быть совершенно таким же, но, видимо, не так…

Странно то, что я могу запустить их, если запускаю WSL2 из CMD. Но не в моей основной установке WSL, той, которую я запускаю из ярлыка на своем рабочем столе Windows.

Существует множество вопросов по этой теме: Здесь, здесь, здесь. Никакие из решений не работают для моей системы. Я пришел к выводу, что при запуске WSL меняет сетевую конфигурацию.

Как воспроизвести

Если я открою терминал (командная строка Windows) и запущу WSL оттуда, это сработает:

C:\Users\me> wsl ~ -e bash --norc --noprofile
bash-5.0$ xeyes               # --> xeyes работает

Но если я открою WSL непосредственно из Windows, это не работает.

user@PC:~$ xeyes
Ошибка: Не удается открыть дисплей: :0

И странно, что как только я открыл WSL2, я не могу снова запустить приложение из WSL, запущенного из CMD.

C:\Users\me> wsl ~ -e bash --norc --noprofile
bash-5.0$ xeyes
Ошибка: Не удается открыть дисплей: :0

Мой вывод: что-то в WSL2 изменило сетевые настройки при запуске.

Возможные идеи

Я пытался изменить переменную DISPLAY.

  • user@PC:~$ export DISPLAY=0.0.0.0 –> та же ошибка
  • user@PC:~$ export DISPLAY=0.0.0.0:0 –> работает несколько минут, затем та же ошибка
  • user@PC:~$ export DISPLAY=10.0.0.3 (локальный IP) –> та же ошибка
  • user@PC:~$ export DISPLAY=10.0.0.3:0 –> работает несколько минут, затем та же ошибка
  • user@PC:~$ export DISPLAY=[route] установленный по умолчанию маршрут –> та же ошибка

Во всех случаях проблема, вероятно, не в DISPLAY, потому что у него одно и то же значение по умолчанию как в CMD, так и в WSL2.

WSL с рабочего стола Windows:

user@PC:~$ echo $DISPLAY –> :0

WSL из терминала:

C:\Users\me> wsl ~ -e bash --norc --noprofile
bash-5.0$ echo $DISPLAY
bash-5.0$ :0

Я думал, может быть, WSL с рабочего стола изменяет сетевые настройки. Но и ifconfig, и ip route show возвращают точно такие же параметры. У меня также нет ничего в .bashrc, что могло бы их изменить, по крайней мере, я так думаю.

Я на Windows 10, WSL2 на Ubuntu.

Попробуйте следующее:
export QT_QPA_PLATFORM="xcb"
sudo apt install libxcb-xinerama0 libqt5x11extras5

основано на комментарии на github:

sudo rm -r /tmp/.X11-unix
ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix

Ответ или решение

Ошибка запуска Qt-приложений в WSL2: Решение проблемы с подключением к дисплею

Введение

Запуск графических приложений на Windows Subsystem for Linux (WSL2) иногда вызывает трудности, особенно когда речь идет о Qt-программах. Пользователи, такие как вы, могут столкнуться с ошибками, связанными с подключением к дисплею. В данном руководстве мы постараемся проанализировать вашу проблему и предложить более детальные решения.

Описание проблемы

Вы упоминаете, что при запуске приложения Qt, такого как xeyes, на WSL2 Ubuntu 20.04, вы получаете следующую ошибку:

Error: Can't open display: :0
qt.qpa.xcb: could not connect to display: :0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found

Эта проблема возникает, когда приложение не может подключиться к выставленному дисплею, что, как предположительно, связано с настройками вашего окружения.

Анализ ситуации

Судя по вашему описанию, приложение работает нормально, если вы запускаете WSL2 через командную строку (CMD), но не работает при запуске напрямую из Windows. Это может быть связано с тем, как WSL управляет переменной окружения DISPLAY и сетевыми настройками в зависимости от способа запуска.

  1. Переменная окружения DISPLAY: При подключении к графическому интерфейсу X11 приложение ожидает, что переменная DISPLAY будет указывать на правильный адрес сервера X. В случае WSL2, по умолчанию DISPLAY=:0, что может быть неправильным.

  2. Сетевые настройки: Возможно, при запуске WSL напрямую из Windows, происходят изменения в сетевых настройках, которые влияют на подключение к X-приложениям.

Решения

  1. Корректировка переменной DISPLAY:
    Попробуйте изменить значение переменной DISPLAY, чтобы указать IP-адрес вашей системы:

    export DISPLAY=$(ip route | grep -oP '(?<=src )(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'):0

    После этого повторите запуск xeyes.

  2. Удаление и создание символической ссылки:
    Убедитесь, что каталоги Unix для X11 настроены правильно:

    sudo rm -r /tmp/.X11-unix
    ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix
  3. Установка необходимых библиотек:
    Иногда решение проблемы может заключаться в отсутствии библиотек:

    sudo apt install libxcb-xinerama0 libqt5x11extras5
    export QT_QPA_PLATFORM="xcb"
  4. Использование WSLg:
    Убедитесь, что ваш WSL2 использует графический интерфейс WSLg. Это облегчит задачу запуска графических приложений и устранит необходимость в настройке DISPLAY. Убедитесь, что в вашей системе установлена последняя версия WSLg.

  5. Изменение настроек термина:
    Если проблема сохраняется, попробуйте использовать другие терминалы, такие как Windows Terminal или другие эмуляторы терминала, чтобы устранить возможные проблемы с конфигурацией.

Заключение

Проблемы с графическими приложениями в WSL2 могут быть сложными, но, следуя приведенным выше рекомендациям, вы сможете устранить большинство ошибок, связанных с подключением к дисплею. Оставайтесь в курсе обновлений WSL и документации, чтобы быть вовремя осведомленным о новых функциях и исправлениях. Если приведенные шаги не помогли, рекомендую обратиться в сообщество разработчиков WSL или поддерживающие форумы для дальнейшей помощи.

Оцените материал
Добавить комментарий

Капча загружается...