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

Posted

技术标签:

【中文标题】升级到 macOS Mojave 后,MATLAB 不再卸载 MEX 文件【英文标题】:MATLAB no longer unloading MEX-files after upgrade to macOS Mojave 【发布时间】:2020-03-07 17:21:41 【问题描述】:

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

例如,使用这个简单的 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 文件?

【问题讨论】:

您是否填写了错误报告? @Kamiccolo:不,我没有。我的印象是这是操作系统的问题,但我不确定,它也可能是 MATLAB。所以我希望在提交错误报告之前了解更多信息。 我想说,不要使用 macOS Majove。 @m7913d *莫哈韦 @CrisLuengo:即使是操作系统可能导致问题,这也是 Mathworks 必须调查的内容。他们有 MacOS,我怀疑苹果有 MATLAB。我会在这种情况下使用 Mathworks。 【参考方案1】:

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

MathWorks rules on MEX file compatibility 是它们经常会在版本之间工作,但如果有不兼容的变化(比如这个),那么你需要重新编译。

【讨论】:

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

以上是关于升级到 macOS Mojave 后,MATLAB 不再卸载 MEX 文件的主要内容,如果未能解决你的问题,请参考以下文章

applesimutils --list 在 MacOS Mojave 和 Xcode 11.3 更新后返回空列表 []

macOS seria 10.12升级到macOS Mojave的报错:xcrun: error: invalid active developer path, missing xcrun

如何在macos升级和安全?

Mojave 升级后不支持 dyld 部分

以编程方式访问 macOS Mojave 中的 Safari 书签

如何忽略/隐藏/关闭macOS Catalina/Mojave的更新通知