2023-07-04

【備忘録】Qt と xcb

XCB (X protocol C-language Binding) は、X11 ディスプレイサーバプロトコルのクライアントサイドを実装したライブラリです。このプロジェクトは Bart Massey 氏によって2001 年に開始されました。1985 年頃に登場した X Window System のクライアント用ライブラリ Xlib を置き換えることを目的としています。XCB は C 言語で書かれており、MIT ライセンスの下で配布されています。

Wikipedia より引用、翻訳・編集

リモートデスクトップで接続した先で PySide6 アプリが起動しない!

今回取り上げる OS は下記のとおりです。

Red Hat Enterprise Linux 9.2 x86_64

家庭内 LAN でひっそり稼働させているファイルサーバーには Red Hat Enterprise Linux (RHEL) をインストールしています。このサーバーの主たる目的は、ファイルサーバーと呼んでいるように、バックアップ用途に使用している大容量 HDD の管理です。その他にも、xrdp のサービスを利用できるようにして、他の PC からリモートデスクトップとしてアクセスしています。24 時間稼働させているサーバーなので、何日もかかるようなプログラムを走らせるのに重宝しています。このサーバーはファンレスの小型 PC ですが、何日も CPU のコアの使用率 100% の状態で使い続けると、とても筐体が熱くなるので、専用に USB TYPE 1 で駆動する小さい扇風機を回して、空気の流れを作っています。🌬️

さて、そんなリモートデスクトップ上で、PySide6 のアプリが動かないことに気が付きました。以前は動いていたような気がしていたのですが、気のせいでしょうか?

例えば下記のようなプログラムを実行しようとしてもコアダンプを出して終了してしまいます。

(venv) [bitwalk@rhel9 PySide6_sample]$ python3 hello.py
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vkkhrdisplay, vnc, wayland-egl, wayland, xcb.

中止 (コアダンプ)
(venv) [bitwalk@rhel9 PySide6_sample]$ 

QT_DEBUG_PLUGINS=1 を付けて詳しくエラーを見てみます。

(venv) [bitwalk@rhel9 PySide6_sample]$ QT_DEBUG_PLUGINS=1 python3 hello.py
qt.core.plugin.factoryloader: checking directory path "/home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms" ...
qt.core.plugin.factoryloader: looking at "/home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/libqeglfs.so"
qt.core.plugin.loader: Found metadata in lib /home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/libqeglfs.so, metadata=
{
    "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
    "MetaData": {
        "Keys": [
            "eglfs"
        ]
    },
    "archlevel": 1,
    "className": "QEglFSIntegrationPlugin",
    "debug": false,
    "version": 394496
}

    ...
  (途中省略)
    ...

qt.core.plugin.factoryloader: Got keys from plugin meta data QList("wayland")
qt.core.plugin.factoryloader: looking at "/home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/libqxcb.so"
qt.core.plugin.loader: Found metadata in lib /home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/libqxcb.so, metadata=
{
    "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
    "MetaData": {
        "Keys": [
            "xcb"
        ]
    },
    "archlevel": 1,
    "className": "QXcbIntegrationPlugin",
    "debug": false,
    "version": 394496
}


qt.core.plugin.factoryloader: Got keys from plugin meta data QList("xcb")
qt.core.plugin.factoryloader: checking directory path "/usr/bin/platforms" ...
qt.core.library: "/home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/libqxcb.so" cannot load: Cannot load library /home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/libqxcb.so: (libxcb-cursor.so.0: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません)
qt.core.plugin.loader: QLibraryPrivate::loadPlugin failed on "/home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/libqxcb.so" : "Cannot load library /home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/libqxcb.so: (libxcb-cursor.so.0: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません)"
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vkkhrdisplay, vnc, wayland-egl, wayland, xcb.

中止 (コアダンプ)
(venv) [bitwalk@rhel9 PySide6_sample]$ 

どうやら libxcb-cursor.so.0 というライブラリが無いことが原因のようです。このライブラリは、RHEL では xcb-util-cursor というパッケージに収録されています。

※ 例えば、pkgs.org というサイトで、ライブラリ名からディストロ毎にパッケージ名を探し出すことができます(参考サイト [2])。

結論を先に書くと、インストールしなければならなかったパッケージは三種類ありました。

トライ&エラーを少なくするには、面倒ですが ldd コマンドで ../venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/libqxcb.so が参照している(参照できている)ライブラリを確認します。

(venv) [bitwalk@rhel9 PySide6_sample]$ ldd /home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/libqxcb.so
    linux-vdso.so.1 (0x00007ffc433c4000)
    libQt6XcbQpa.so.6 => /home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/../../lib/libQt6XcbQpa.so.6 (0x00007f8e68dd7000)
    libxkbcommon-x11.so.0 => /lib64/libxkbcommon-x11.so.0 (0x00007f8e68dbf000)
    libxkbcommon.so.0 => /lib64/libxkbcommon.so.0 (0x00007f8e68d7a000)
    libxcb-cursor.so.0 => not found
    libxcb-icccm.so.4 => not found
    libxcb-image.so.0 => /lib64/libxcb-image.so.0 (0x00007f8e68d6b000)
    libxcb-keysyms.so.1 => not found
    libxcb-randr.so.0 => /lib64/libxcb-randr.so.0 (0x00007f8e68d58000)
    libxcb-render-util.so.0 => /lib64/libxcb-render-util.so.0 (0x00007f8e68d51000)
    libxcb-shm.so.0 => /lib64/libxcb-shm.so.0 (0x00007f8e68d4c000)
    libxcb-sync.so.1 => /lib64/libxcb-sync.so.1 (0x00007f8e68d42000)
    libxcb-xfixes.so.0 => /lib64/libxcb-xfixes.so.0 (0x00007f8e68d36000)
    libxcb-render.so.0 => /lib64/libxcb-render.so.0 (0x00007f8e68d26000)
    libxcb-shape.so.0 => /lib64/libxcb-shape.so.0 (0x00007f8e68d21000)
    libxcb-xkb.so.1 => /lib64/libxcb-xkb.so.1 (0x00007f8e68d03000)
    libxcb.so.1 => /lib64/libxcb.so.1 (0x00007f8e68cd8000)
    libQt6OpenGL.so.6 => /home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/../../lib/libQt6OpenGL.so.6 (0x00007f8e68c36000)
    libQt6Gui.so.6 => /home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/../../lib/libQt6Gui.so.6 (0x00007f8e68200000)
    libGL.so.1 => /lib64/libGL.so.1 (0x00007f8e68179000)
    libQt6Core.so.6 => /home/bitwalk/PycharmProjects/PySide6_sample/venv/lib/python3.9/site-packages/PySide6/Qt/plugins/platforms/../../lib/libQt6Core.so.6 (0x00007f8e67a00000)
    libX11-xcb.so.1 => /lib64/libX11-xcb.so.1 (0x00007f8e68c2f000)
    libX11.so.6 => /lib64/libX11.so.6 (0x00007f8e678b8000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f8e68c2a000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8e68c23000)
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f8e67600000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f8e6809e000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f8e68c08000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f8e67200000)
    libxcb-icccm.so.4 => not found
    libxcb-keysyms.so.1 => not found
    libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f8e674c6000)

    ...
  (途中省略)
    ...

    liblz4.so.1 => /lib64/liblz4.so.1 (0x00007f8e66ea0000)
    libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x00007f8e669da000)
(venv) [bitwalk@rhel9 PySide6_sample]$ 

not found と表示されているライブラリを含むパッケージを調べたところ、結局以下の3つのパッケージが足りないことがわかりました。

  • xcb-util-cursor
  • xcb-util-wm
  • xcb-util-keysyms

上記3つのパッケージをインストールして、無事、PySide6 のアプリをリモートデスクトップ上で起動できるようになりました。👍

参考サイト

  1. xcb
  2. Libxcb-cursor.so.0()(64bit) Download (RPM)

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



このエントリーをはてなブックマークに追加

0 件のコメント: