我正在Windows docker容器中运行已编译的Matlab 2016a可执行文件。 Matlab编译器运行时已安装在容器中。当我执行不需要图形处理的代码时,这可以很好地工作。
我扩展了程序,使其包含一些非常基本的绘图逻辑,并且导致了此异常:
"MATLAB:dispatcher:loadLibrary",message:"While setting the 'Parent' property of ''Axes'':
Can't load 'C:\\Program Files\\MATLAB\\MATLAB Runtime\\v901\\bin\\win64\\osgserver.dll': The specified module could not be found.
这是堆栈跟踪:file:"C:\\Program Files\\MATLAB\\MATLAB Runtime\\v901\\mcr\\toolbox\\matlab\\graph2d\\subplot.p",name:"subplot",line:0
然后,我编写了一个更简单的程序,该程序只创建一个图形并绘制一条直线。运行此代码会产生相同的osgserver.dll错误。我还检查了osgserver.dll路径,并且该文件存在。这篇文章使我认为这是OpenGL问题:
https://www.mathworks.com/matlabcentral/answers/296652-can-t-reload-osgserver-dll
我怀疑osgserver.dll中的OSG是开放场景图,它似乎是某种图形渲染中间件:
http://www.openscenegraph.org/index.php/about/features
由于这是一个Docker容器,因此我可以理解为什么我在执行依赖于硬件的图形代码时会遇到麻烦。为了解决这个问题,我尝试将OpenGL切换到软件,将渲染器切换到“painters”:
opengl('software');
set(0, 'DefaultFigureRenderer', 'painters');
当我这样做时,会出现相同的osgserver.dll问题。我要怎么做才能使渲染在Windows docker容器中工作?谢谢
最佳答案
我解决了自己的问题。
第一步是将Mesa安装为OpenGL的软件渲染器。该站点提供Windows版本的Mesa。下载64位版本,其中包含一个名为opengl32.dll的文件。将dll放在执行已编译Matlab可执行文件的目录中:
https://fdossena.com/?p=mesa/index.frag
这样可以防止在执行图形代码时出现osgserver.dll Matlab错误。但是我仍然无法通过配置OpenGL代码来使用软件。您可能希望此代码能够正常工作,但不能:
opengl('software');
通过更改渲染器,我可以使渲染工作:set(0, 'DefaultFigureRenderer', 'painters');
我认为这是部分解决方案。我实际上没有让OpenGL正常工作。但是我可以通过安装OpenGL软件版本来防止osgserver.dll错误。更改渲染器首先避免了对OpenGL的需求。但是使用OpenGL并不是该项目的必要条件,因此它满足了我的需求。
关于matlab - Windows docker容器中已编译的Matlab故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62539251/