PythonでQtアプリを起動すると、「QOpenGLShader: could not create shader」と表示されて失敗することがある。
原因
https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826 にあるが、状況によりlibGL.so.1ではなくlibGL.soがロードされ、これがDebianパッケージのドライバだと/usr/lib/mesa-diverted/x86_64-linux-gnu/libGL.soにリンクされていることが原因である。
(NVIDIAインストーラならばこういう状況は発生しないが、カーネル更新時に自動でdkmsが働かないためドライバを入れ忘れる可能性が出てしまう、なのでパッケージを使うのが良かろう)
方法
短期的には、sudo ln -sf libGL.so.1 /usr/lib/x86_64-linux-gnu/libGL.so
とすればよいが、グラフィックドライバ等の更新でmesa-divertedに戻ってしまう。恒久的に書き換えるには以下を実行すれば良い。
sudo update-alternatives --install /usr/lib/mesa-diverted/libGL.so-master libGL.so-master /usr/lib/x86_64-linux-gnu/nvidia 9999 \
--slave /usr/lib/x86_64-linux-gnu/libEGL.so glx--libEGL.so-x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/nvidia/current/libEGL.so.1 \
--slave /usr/lib/x86_64-linux-gnu/libGL.so glx--libGL.so-x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/nvidia/current/libGL.so.1 \
--slave /usr/lib/x86_64-linux-gnu/libGLESv1_CM.so glx--libGLESv1_CM.so-x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/nvidia/current/libGLESv1_CM_nvidia.so.1 \
--slave /usr/lib/x86_64-linux-gnu/libGLESv2.so glx--libGLESv2.so-x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/nvidia/current/libGLESv2_nvidia.so.2
このスクリプトは /var/lib/dpkg/info/glx-alternative-mesa.postinst を読んだ上で自分で構築したものである。
追伸
Qt 5.12.1以降では直っているらしいけど( https://bugreports.qt.io/browse/QTBUG-71488 )、Debian busterには来ないよね…
211203追記
会社のマシンをDebian 11に更新したんですが、その際にnvidiaドライバがGLVND版に変わりました。GLVND版はファイル構成が違うらしいですね。というわけでこのハックは削除する必要があります。
なおGLVND版であれば/usr/lib/mesa-diverted/x86_64-linux-gnu/libGL.soを使って問題なくnvidiaドライバをロードできます。
sudo update-alternatives --remove libGL.so-master /usr/lib/x86_64-linux-gnu/nvidia