在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
(未记录,来自this answer)在其输出中仍显示/Users/cris/matlab/get_data_pointer.mexmaci64
。更改MEX文件的源代码并重新编译表明,确实从未重新加载MEX文件,而直到有人退出MATLAB为止,旧版本仍在运行。
我在macOS Mojave的MATLAB R2017a上看到了这一点。在High Sierra下使用相同的MATLAB版本从来没有问题。
如何强制MATLAB在不重新启动的情况下卸载MEX文件?