`qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.` というエラーが起きたときの対処

Ubuntu Desktop(18.04)環境でrstudioを起動したらこんな感じのエラーが起きた

```
$ rstudio 
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, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, xcb.
```

QPAのプラグインでxcbを使おうとしたが初期化に失敗したとのこと。

QPAは[Qt Platform Abstraction](https://doc.qt.io/qt-5/qpa.html)の略で、プラットフォーム（windows,ios,xcb）を抽象化して扱うQtの仕組みの一つ。プラグイン機構を採用しており、プラットフォームを選べる/追加できる仕組みとなっている。

今回はX11上で動かそうとしたので、xcb(Qt上はqxcbというプラグイン名)を使おうとしたが、初期化がうまくいかなかった、ということみたい。その初期化がうまくいかなかった原因が分かれば苦労しないんですけどね。。



エラー文「`"Could not load the Qt platform plugin"`」でざっくり調べると、以下がヒット。

https://stackoverflow.com/questions/29405689/qt-5-4-1-this-application-failed-to-start-because-it-could-not-find-or-load-th/40991619

回答で2つ書かれている。

- プラグインが使う共有ライブラリがちゃんとそろっているか`ldd`で調べろ
- 環境変数`QT_DEBUG_PLUGINS=1` を与えて実行しろ

なるほど。

### lddで見る

プラグインがどこにあるかは雑に`find /usr | grep "qxcb"` で調べた。

今回はrstudio同梱のlibqxcb.soが引っかかったのでこれで見る。

```
$ ldd /usr/lib/rstudio/plugins/platforms/libqxcb.so 

linux-vdso.so.1 (0x00007ffdebd5a000)
(中略)
libxkbcommon-x11.so.0 => not found
libxkbcommon.so.0 => /usr/lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f651288c000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6512688000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f65122ff000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f65120e7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6511cf6000)
libxkbcommon-x11.so.0 => not found
(中略)
```

1つでも`not found`となっている部分がある。この部分の共有ライブラリを用意する必要がある。

今回はaptで入れただけで済んだ。

```
sudo apt install libxkbcommon-x11-0
```

再度、`ldd`を試すと、not foundの表示は消えた。この状態でrstudioを起動してみるとエラーにならず起動できた。

### 環境変数`QT_DEBUG_PLUGINS=1`を付ける

せっかくなので、こっちも試す。

`apt remove libxkbcommon-x11-0`をした後、同じエラーが出るようになった状態にしてから試した。

```
$ QT_DEBUG_PLUGINS=1 rstudio

（中略）

QFactoryLoader::QFactoryLoader() looking at "/usr/lib/rstudio/plugins/platforms/libqxcb.so"
Found metadata in lib /usr/lib/rstudio/plugins/platforms/libqxcb.so, metadata=
{
    "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
    "MetaData": {
        "Keys": [
            "xcb"
        ]
    },
    "archreq": 0,
    "className": "QXcbIntegrationPlugin",
    "debug": false,
    "version": 330752
}


Got keys from plugin meta data ("xcb")
QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/rstudio/bin/platforms" ...
Cannot load library /usr/lib/rstudio/plugins/platforms/libqxcb.so: (libxkbcommon-x11.so.0: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません)
QLibraryPrivate::loadPlugin failed on "/usr/lib/rstudio/plugins/platforms/libqxcb.so" : "Cannot load library /usr/lib/rstudio/plugins/platforms/libqxcb.so: (libxkbcommon-x11.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, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, xcb.
```

最後の4行は同じだが、それより前のログがわかりやすく出ていることが分かる。最後の4行を出すぐらいなら最初からこれぐらい出してほしさもある。