首先,我的系统信息:
- 4.13.0-26-通用#29~16.04.2-Ubuntu SMP 2018 年 1 月 9 日星期二 22:00:44 UTC x86_64 x86_64 x86_64 GNU/Linux
- Matlab R2016b(64 位)的全新安装
- 显卡:AMD/ATI Pitcairn PRO (Radeon HD 7850)
Vanilla 安装问题
因此,我从命令行启动 Matlab,不使用任何参数。我设置了两个环境变量LIBGL_DEBUG=verbose
和MESA_DEBUG=1
,以获取任何错误的详细打印输出。软件启动时没有错误。接下来,我发出一个简单的绘图命令:
plot(1,1, 'b*'); grid on;
Matlab 成功创建了绘图,但发出了一系列错误,提示存在低级图形错误。从命令行我看到以下消息:
libGL: pci id for fd 570: 1002:6819, driver radeonsi
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/tls/radeonsi_dri.so
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so
libGL: dlopen /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so failed (/opt/local/MATLAB/R2016b/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so))
还有更多,但最终结果是一样的:链接器无法使用 Matlab 已加载的 libstdc++.so 文件加载图形驱动程序。为了解决这个问题,我重命名了 Matlab 附带的相关库,以强制它使用系统库(包括版本GLIBCXX_3.4.21
):
cd /opt/local/MATLAB/R2016b/sys/os/glnxa64
mv libstdc++.so.6 libstdc++.so.6.bak
mv libstdc++.so.6.0.20 libstdc++.so.6.0.20.bak
修改安装的问题
重命名 C++ 库以强制 Matlab 链接到系统库后,我重新启动了 Matlab。环境变量仍处于设置状态,因此任何 libgl 或 mesa 错误都应报告给终端。程序启动后,我立即在 Matlab 中收到以下错误:
com.jogamp.opengl.GLException: X11GLXDrawableFactory - Could not initialize shared resources for X11GraphicsDevice[type .x11, connection :1, unitID 0, handle 0x0, owner false, ResourceToolkitLock[obj 0x7c1bc33e, isOwner false, <2af5b1a, 46860956>[count 0, qsz 0, owner <NULL>]]]
at jogamp.opengl.x11.glx.X11GLXDrawableFactory$SharedResourceImplementation.createSharedResource(X11GLXDrawableFactory.java:326)
at jogamp.opengl.SharedResourceRunner.run(SharedResourceRunner.java:297)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:688)
at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:580)
at jogamp.opengl.x11.glx.X11GLXDrawableFactory$SharedResourceImplementation.createSharedResource(X11GLXDrawableFactory.java:297)
... 2 more
Exception in thread "Startup Class Loader" java.lang.InternalError: XXX0 profile[1]: GL3bc -> profileImpl GL4bc !!! not mapped
at com.jogamp.opengl.GLProfile.computeProfileMap(GLProfile.java:2047)
at com.jogamp.opengl.GLProfile.initProfilesForDeviceCritical(GLProfile.java:1917)
at com.jogamp.opengl.GLProfile.initProfilesForDevice(GLProfile.java:1866)
at com.jogamp.opengl.GLProfile.initProfilesForDefaultDevices(GLProfile.java:1835)
at com.jogamp.opengl.GLProfile.access$000(GLProfile.java:79)
at com.jogamp.opengl.GLProfile$1.run(GLProfile.java:229)
at java.security.AccessController.doPrivileged(Native Method)
at com.jogamp.opengl.GLProfile.initSingleton(GLProfile.java:215)
at com.mathworks.hg.peer.JavaSceneServerPeer.initializeJOGL(JavaSceneServerPeer.java:147)
at com.mathworks.hg.peer.JavaSceneServerPeer.<clinit>(JavaSceneServerPeer.java:117)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.mathworks.mde.desk.StartupClassLoader.loadClass(StartupClassLoader.java:262)
at com.mathworks.mde.desk.StartupClassLoader.access$900(StartupClassLoader.java:25)
at com.mathworks.mde.desk.StartupClassLoader$2.run(StartupClassLoader.java:248)
at java.lang.Thread.run(Unknown Source)
此外,终端输出中还会显示以下消息:
libGL: pci id for fd 570: 1002:6819, driver radeonsi
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/tls/radeonsi_dri.so
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so
libGL: Using DRI3 for screen 0
这些消息并不表示有任何故障;看起来 radeonsi_dri 对象已成功加载。当我尝试与上述相同的绘图命令时,我在 Matlab 中收到以下消息:
Caught unexpected fl::except::IInternalException
图中显示的是空白图像;图尚未创建。
其他说明
- 我也尝试重命名
libgcc_s.so.1
Matlab 目录中的库以便它使用系统版本,但这并没有改变任何东西。 - 我的 Xorg.0.log 文件中没有错误(EE)
- 我已经成功地对OpenGL和视频卡进行了基准测试
glmark2
,即OpenGL在我的计算机上通过硬件加速运行得非常好,但Matlab存在一些问题。 - Matlab R2016b 附带
libGL.so.1.6.0
(在 中R2016b/sys/opengl/lib/glnxa64
),但我的操作系统版本是libGL.so.1.2.0
)。这会导致问题吗?我尝试重命名 Matlab 附带的 libGL 文件以强制它使用系统版本,但错误消息仍然相同。 - 使用修改后的 libstdc++ 文件,我可以通过命令在软件 openGL 模式下运行 Matlab
matlab -softwareopengl
。绘图工作正常,尽管 Mesa 发出警告/错误,User error: GL_INVALID_ENUM in glGetIntegerv(pname=GL_MAJOR_VERSION)
答案1
这个解决方案源自我的相同的帖子在 Matlab 论坛上。正如 Matlab 论坛中的其他人所发现的,这似乎是与jogl
通过 glRenderer 字符串中的“Gallium”字符串匹配来检测 Mesa 驱动程序相关的错误。Mesa 人员显然最近对开源驱动程序/版本的报告方式进行了更改。
步骤 1(如下)只需完成一次,而步骤 2、3、4 必须为您机器上安装的每个版本的 Matlab 完成。
- 安装最新的 libjogl2 库:
#添加 Xenial-Proposed 存储库(自 2018 年 2 月起必需) sudo sh -c "echo 'deb http://archive.ubuntu.com/ubuntu/ \ xenial 提出的受限主多元宇宙' \ > /etc/apt/sources.list.d/xenial-proposed.list” sudo apt 更新-y # 仅从 xenial-proposed 安装以下内容! #(你不想将所有软件包都升级到最新版) sudo apt install -y libjogl2-java/xenial-proposed#包括 libjogl2-jni # 删除 XENIAL-PROPOSED 以避免对其他软件包进行不必要的更新 sudo rm /etc/apt/sources.list.d/xenial-proposed.list sudo apt 更新-y
- 重命名 C++ 标准库文件(重复上述问题)。这可确保图形驱动程序加载所需的相同标准库,而不是 Matlab 捆绑的标准库。
cd $matlabroot/sys/os/glnxa64 mv libstdc++.so.6 libstdc++.so.6.bak mv libstdc++.so.6.0.20 libstdc++.so.6.0.20.bak
更改中的
classpath.txt
和文件。使用我原来的路径,此路径扩展为librarypath.txt
$matlabroot/toolbox/local
/opt/local/MATLAB/R2017b/toolbox/local
- 在 中
classpath.txt
,找到并注释掉以下两行:
- 在 中
$matlabroot/java/jarext/gluegen-rt.jar $matlabroot/java/jarext/jogl-all.jar
并将其替换为以下内容
/usr/share/java/jogl2.jar /usr/share/java/gluegen2-rt.jar
- 在
librarypath.txt
文件末尾添加一个新行
/usr/lib/jni
- 根据上面提供的原始脚本,Matlab 现在应该可以正常运行。但是,为了确保默认包含的库不会干扰,请在 中重命名以下库
$matlabroot/bin/glnxa64
:
cd $matlabroot/bin/glnxa64 sudo mv libjogl_desktop.so libjogl_desktop.so.bak sudo mv libgluegen-rt.so libgluegen-rt.so.bak sudo mv libnativewindow_awt.so libnativewindow_awt.so.bak sudo mv libnativewindow_x11.so libnativewindow_x11.so.bak
最后,重$matlabroot/toolbox/local/classpath
命名3p_jogl
文件:
cd $matlabroot/toolbox/local/classpath sudo mv 3p_jogl.jcp 3p_jogl.jcp.bak
就这样!问题解决了!希望这些 Xenial-Proposed 软件包能在不久的将来推出到稳定分支。