Во-первых, моя системная информация:

  • 4.13.0-26-generic # 29 ~ 16.04.2-Ubuntu SMP Вт 9 января 22:00:44 UTC 2018 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))

Их намного больше, но конечный результат тот же: компоновщик не может загрузить графические драйверы с помощью libstdc++., Поэтому файл Matlab уже загружен. Чтобы исправить эту проблему, я переименую соответствующие библиотеки, которые поставляются с 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.0R2016b/sys/opengl/lib/glnxa64), но моя версия ОС - libGL.so.1.2.0). Может ли это вызвать проблемы? Я попытался переименовать файлы libGL, поставляемые с Matlab, чтобы заставить его использовать системные версии, но сообщения об ошибках все те же.
  • С измененными файлами libstdc++ я могу запустить Matlab в программном режиме openGL с помощью команды matlab -softwareopengl . Печать работает нормально, хотя Mesa выдает предупреждение / ошибку, User error: GL_INVALID_ENUM in glGetIntegerv(pname=GL_MAJOR_VERSION)

1 ответ1

0

Это решение происходит из моего идентичного поста на форуме Matlab. Как выяснили другие на форуме Matlab, это похоже на ошибку в jogl связанную с обнаружением драйверов Mesa по совпадению строк для "Gallium" в строке glRenderer. Люди из Mesa, по-видимому, недавно внесли изменения в то, как сообщается о драйвере / версии с открытым исходным кодом.

Шаг 1 (ниже) необходимо выполнить только один раз, а шаги 2, 3, 4 - для каждой версии Matlab, установленной на вашем компьютере.

  1. Установите новейшую библиотеку libjogl2:
#Add Xenial-Proposed repository (necessary as of Feb. 2018)
sudo sh -c "echo 'deb http://archive.ubuntu.com/ubuntu/ \
xenial-proposed restricted main multiverse universe' \
> /etc/apt/sources.list.d/xenial-proposed.list"

sudo apt update -y

# ONLY INSTALL THE FOLLOWING from xenial-proposed!
# (you don't want to upgrade ALL your packages to bleeding-edge)
sudo apt install -y libjogl2-java/xenial-proposed #includes libjogl2-jni

# REMOVE XENIAL-PROPOSED to avoid unwanted updates to other packages
sudo rm /etc/apt/sources.list.d/xenial-proposed.list
sudo apt update -y
  1. Переименуйте файлы стандартной библиотеки 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
  1. Измените файлы 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
  1. Согласно оригинальному сценарию, представленному выше, 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 появятся в стабильной ветке в недалеком будущем.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .