Cri*_*ngo 9 c macos matlab shared-libraries mex
在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]);
}
Run Code Online (Sandbox Code Playgroud)
我们可以创建MEX文件并将其加载到内存中
mex get_data_pointer.c
get_data_pointer(0)
Run Code Online (Sandbox Code Playgroud)
为了清除它,
clear mex
[~,mexfiles] = inmem
version -modules
Run Code Online (Sandbox Code Playgroud)
inmem确实返回了一个空单元格数组,指示未在内存中加载MEX文件,但是version -modules(未记录,根据此答案)仍显示/Users/cris/matlab/get_data_pointer.mexmaci64在其输出中。更改MEX文件的源代码并重新编译表明,确实从未重新加载MEX文件,旧版本仍在运行,直到有人退出MATLAB。
我在macOS Mojave的MATLAB R2017a上看到了这一点。在High Sierra下使用相同的MATLAB版本从来没有问题。
如何强制MATLAB在不重新启动的情况下卸载MEX文件?
小智 -1
这可能是 libstdc++ 的变化。这是 Apple 很久以前就弃用的运行时库(我认为是 XCode 8),最终在XCode 10和 Mojave 中完全放弃。因此,您拥有的 MEX 文件可能是用旧版本编译的。
MathWorks关于 MEX 文件兼容性的规则是它们通常可以在版本之间工作,但如果存在不兼容的更改(如本例),则需要重新编译。
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |