LoginSignup
0
0

More than 1 year has passed since last update.

NVIDIA環境でPython+Qtアプリを起動する(shader作成に失敗する場合)

Last updated at Posted at 2019-02-18

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0