windows docker容器中编译matlab失败
Posted
技术标签:
【中文标题】windows docker容器中编译matlab失败【英文标题】:Compiled matlab failure in windows docker container 【发布时间】:2020-06-23 16:16:50 【问题描述】:我正在 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 是 Open Scene Graph,它似乎是某种图形渲染中间件: http://www.openscenegraph.org/index.php/about/features
由于这是一个 docker 容器,我可以理解为什么我在执行依赖于硬件的图形代码时会遇到问题。为了解决这个问题,我尝试将 OpenGL 切换到软件,将渲染器切换到“画家”:
opengl('software');
set(0, 'DefaultFigureRenderer', 'painters');
当我这样做时,我遇到了同样的 osgserver.dll 问题。我必须做些什么才能让渲染在 Windows docker 容器中工作?
谢谢
【问题讨论】:
When I execute this code
可能包括那个代码?
任何包含调用 subplot 或 plot 的代码都会产生相同的错误
您是否尝试将子图的 Parent 属性设置为图形句柄?
@oro777 你能解释一下你的推理吗?调用 subplot 函数时出现错误,所以我认为我无法处理它。
隐形人是如何制作的?这在 MATLAB IDE 中有效吗?
【参考方案1】:
我解决了我自己的问题。
第一步是安装 Mesa 作为 OpenGL 的软件渲染器。该站点提供了 Mesa 的 Windows 版本。下载 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 并不是该项目的必需品,所以它满足了我的需求。
【讨论】:
以上是关于windows docker容器中编译matlab失败的主要内容,如果未能解决你的问题,请参考以下文章