升级到 macOS Mojave 后,MATLAB 不再卸载 MEX 文件

MATLAB no longer unloading MEX-files after upgrade to macOS Mojave

提问人:Cris Luengo 提问时间:11/12/2019 更新时间:11/22/2019 访问量:650

问:

在 MATLAB 中,从内存中卸载所有 MEX 文件(除非它们被锁定)。在以前版本的 macOS 下,我只需发出命令即可重新编译 MEX 文件并运行修改后的版本,而无需重新启动 MATLAB。在莫哈韦下,这不再可能。clear mexclear mex

例如,以这个微不足道的 MEX 文件 () 为例:get_data_pointer.c

#include "mex.h"

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
  plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL);
  *(uint64_t*)mxGetData(plhs[0]) = (uint64_t)mxGetData(prhs[0]);
}

我们可以创建 MEX 文件并将其加载到内存中

mex get_data_pointer.c
get_data_pointer(0)

要清除它,

clear mex
[~,mexfiles] = inmem
version -modules

inmemindeed 返回一个空元胞数组,指示内存中没有加载 MEX 文件,但是(未记录,来自此答案)仍显示在其输出中。更改 MEX 文件源代码并重新编译表明,实际上,MEX 文件从未重新加载,旧版本仍在运行,直到退出 MATLAB。version -modules/Users/cris/matlab/get_data_pointer.mexmaci64

我在macOS Mojave上的MATLAB R2017a上看到了这一点。这在High Sierra下的相同MATLAB版本中从来都不是问题。

如何在不重新启动的情况下强制 MATLAB 卸载 MEX 文件?

C macOS MATLAB 共享库 MEX

评论

0赞 Kamiccolo 11/15/2019
您是否填写了错误报告?
0赞 Cris Luengo 11/15/2019
@Kamiccolo:不,我没有。我的印象是这是操作系统的问题,但我不确定,也可能是 MATLAB。因此,我希望在提交错误报告之前了解更多信息。
3赞 m7913d 11/21/2019
我会说,不要使用 macOS Majove。
2赞 S.S. Anne 11/21/2019
@m7913d *莫哈韦
3赞 Daniel 11/22/2019
@CrisLuengo:即使操作系统可能导致问题,这也是 Mathworks 必须调查的问题。他们有 MacOS,我怀疑苹果是否有可用的 MATLAB。在这种情况下,我会使用 Mathworks。

答:

-1赞 MPG 11/22/2019 #1

这可能是 libstdc++ 的变化。这是一个运行时库,Apple 很久以前就弃用了它(我认为是 XCode 8),最终在 XCode 10 和 Mojave 中完全放弃了。因此,您拥有的 MEX 文件可能是使用旧版本编译的。

MathWorks 关于 MEX 文件兼容性的规则是,它们通常在版本之间起作用,但如果存在不兼容的更改(例如此更改),则需要重新编译。

评论

0赞 Cris Luengo 11/22/2019
从问题文本中可以看出,在相同版本的 MATLAB 和相同版本的操作系统上编译的 MEX 文件会出现问题。实际上,我用一个简单的 MEX 文件演示了这个问题,我在不退出 MATLAB 的情况下编译、运行,然后重新编译该文件。