【Ubuntu】Ubuntu16.04下WPS演示閃退

widiot1發表於2018-04-15

1 問題描述

Ubuntu16.04在更新了NVIDIA驅動之後,出現WPS演示閃退的問題。

在命令列執行WPS演示:

$ cd /opt/kingsoft/wps-office/office6
$ ./wpp

得到的錯誤資訊如下:

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Critical: Errors linking simple shader: ""
Critical: Errors linking blit shader: ""
段錯誤 (核心已轉儲)

可能是沒有使用NVIDIA驅動的libGL庫導致的。

2 刪除/usr/lib/i386-linux-gnu/mesa/libGL.so.1

如果使用nvidia驅動程式,有時會看到libGL.so.1指向由mesa和NVIDIA提供的模糊libGL(即有多個libGL)。執行如下命令測試:

$ sudo ldconfig -p | grep -i gl.so

輸出如下:

...
libGL.so.1 (libc6,x86-64) => /usr/lib/nvidia-378/libGL.so.1
libGL.so.1 (libc6) => /usr/lib/i386-linux-gnu/mesa/libGL.so.1
libGL.so.1 (libc6) => /usr/lib32/nvidia-378/libGL.so.1
...

可以看到有mesa提供的libGL.so.1,也有NVIDIA提供的。

現在只需要移除mesa提供的libGL.so.1,就可以恢復正常:

$ sudo rm /usr/lib/i386-linux-gnu/mesa/libGL.so.1

上面的方法是別人提供的,我照做了,但是問題仍然沒有解決,因為我的連結不是多了libGL.so.1,而是多了libGL.so,如下所示:

...
libGL.so.1 (libc6,x86-64) => /usr/lib/nvidia-384/libGL.so.1
libGL.so.1 (libc6) => /usr/lib32/nvidia-384/libGL.so.1
libGL.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libGL.so
libGL.so (libc6,x86-64) => /usr/lib/nvidia-384/libGL.so
libGL.so (libc6) => /usr/lib32/nvidia-384/libGL.so
...

可是我沒有刪除/usr/lib/x86_64-linux-gnu/libGL.so,因為我不敢 ?,所以我採用了以下方法,重定向/usr/lib/x86_64-linux-gnu/libGL.so。

3 重連結/usr/lib/x86_64-linux-gnu/libGL.so

先找到libGL.so的位置(其實不必要):

$ locate libGL.so

然後備份libGL.so,再重新建立連結,指向NVIDIA的libGL.so

$ sudo mv /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGL.so.bak
$ sudo ln -s /usr/lib/nvidia-352/libGL.so.352.63 /usr/lib/x86_64-linux-gnu/libGL.so

這樣就可以了,我的問題就得到了解決。不需要重新建立libglx.so的連結,也不需要注意迴圈登入問題。

不過之前我參考該部落格一步一步執行,說是要那樣做才不會出現迴圈登入問題,我照做了最後卻出現了迴圈登入的問題,害得我重新安裝了NVIDA驅動、CUDA和cuDNN,差點就想重灌系統了,後來檢視了錯誤報告,如下:

$ vim ~/.xsession-errors

然後根據裡面的錯誤資訊正確解決了迴圈登入問題。

4 重複登入

重新安裝NVIDIA驅動後出現了重複登入的問題,最後根據資料和自己的理解,找到了解決方法,如下所示:

sudo rm  /usr/lib/x86_64-linux-gnu/libGL.so.1
sudo ln -s /usr/lib/x86_64-linux-gnu/libGL.so /usr/lib/x86_64-linux-gnu/libGL.so.1

其實就是參考的部落格中把libGL.so.1和libGL.so的順序搞錯了。

5 總結

正確的操作步驟應該是:

  1. 先檢視自己的系統中是libGL.so多了,還是libGL.so.1多了
  2. 根據實際情況修改或刪除多出來的libGL.so或libGL.so.1
  3. 修改還是刪除,自己決定,但是千萬記得備份

6 參考

相關文章