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


10

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

例如,使用以下简单的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

inmem确实返回了一个空单元格数组,指示未在内存中加载任何MEX文件,但是version -modules(未记录,根据此答案)仍显示/Users/cris/matlab/get_data_pointer.mexmaci64在其输出中。更改MEX文件的源代码并重新编译表明,确实从未重新加载MEX文件,旧版本仍在运行,直到有人退出MATLAB。

我在macOS Mojave的MATLAB R2017a上看到了这一点。在High Sierra下使用相同的MATLAB版本从来没有问题。

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


您是否填写了错误报告?
Kamiccolo

@Kamiccolo:不,我没有。我的印象是这是操作系统的问题,但我不确定,它也可能是MATLAB。因此,我希望在提交错误报告之前了解更多有关它的信息。
克里斯·伦戈

2
我会说,不要使用macOS Majove。
m7913d

1
@ m7913d *莫哈韦
SS安妮

2
@CrisLuengo:即使是可能导致问题的操作系统,Mathworks也必须对此进行调查。他们有MacOS,我怀疑苹果有没有MATLAB。在这种情况下,我会使用Mathworks。
丹尼尔(Daniel)

Answers:


0

这可能是libstdc ++的更改。这是一个运行库,Apple早已弃用了该库(我认为是XCode 8),最后完全放到了XCode 10和Mojave中。因此,您拥有的MEX文件可能是使用较旧的版本编译的。

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


从问题文本可以看出,问题是使用在相同版本的MATLAB和相同版本的OS上编译的MEX文件发生的。实际上,我使用一个简单的MEX文件演示了该问题,该文件在我不退出MATLAB的情况下进行了编译,运行和重新编译。
克里斯·伦戈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.