强制MATLAB重新加载在mex函数中链接的库

9
我有一个Mex函数,叫做myfunction.mexmaci64(这是在OS X上正确的名称结尾)。
现在,myfunction链接到库mylibrary.dylib。两者均位于同一文件夹中。
现在,每当我更改mylibrary中的内容时,MATLAB不重新加载新的库版本,而是使用旧版本,直到我重新启动MATLAB。这对开发和调试工作来说非常烦人。是否有一种方法可以强制MATLAB重新加载库而不必重启应用程序?
注意:将该库静态链接到Mex函数中很容易。然而,由于我在许多Mex文件之间链接相同的库,因此我更喜欢保留单个共享库以减少编译时间和数据冗余。
编辑:
关于讨论clear mex是否有帮助:
[~, loaded_mexes] = inmem('-completenames'); % get canonica

返回一个包含所有已加载的 mex 文件的列表。该列表不包含链接的库,而只包含 mex 文件本身。使用 clear mex 命令可以成功地清空这个列表,但不会卸载 mylibrary - 再次运行 mex 函数时,输出结果与旧共享库相同。


unloadlibrary() 是一个选项吗?http://www.mathworks.de/de/help/matlab/ref/unloadlibrary.html - H.Muster
@H.Muster 或许 unloadlibrary() 可以帮忙。但是,我不知道如何使用它。只是用我的库的路径调用它会返回 Could not find file mylibrary.dylib。此外,文档还列出了限制条件 Use with libraries that are loaded using the loadlibrary function.。可能 mex 文件没有使用 loadlibrary(我从未提供过 loadlibrary 所需的头文件)。 - Thilo
1
@Thilo 我只需要处理卸载mex函数本身,而不是它引用的库。我假设当MATLAB卸载mex文件时,操作系统会为您卸载它。你是如何链接到 mylibrary 的?编译mex函数时,链接器是否为您绑定了(doing the binding),或者您使用了 dlopen()? 如果是后者,您需要调用 dlclose()。可以注册一个 mexAtExit 函数,在其中进行此调用。 - Praetorian
@Thilo:inmem 只显示加载在内存中的 MEX 函数,而不是外部依赖项。在 Windows 上,您可以使用 feature dumpmem 查看 MATLAB 加载的所有 DLL(包括其自身)。 - Amro
可能是重复问题:Mex 函数重新编译后未更新。上次我调查此问题时,我无法复现这个问题。结论是链接的共享库没有释放所有资源,因此仍然留在内存中(或者这种行为是特定于平台的,我在 Windows 上测试过)。 - Amro
@Amro:感谢您的建议。很可能该库没有释放每个分配的内存位。现在,bdclose all可以使用。一旦我有更多时间,我会进一步调查。也许我的库存在问题(最坏的情况可能是我在MATLAB之外使用库时遇到其他问题的原因)。 - Thilo
3个回答

5
清除内存中的库,我通常会使用以下方法:

bdclose all;

如果我真的感到好斗,我会执行以下操作:
bdclose all; % clear all libraries out of memory ( supposedly )
clear all;   % clear all workspace variables, mex, etc. ( supposedly )
rehash;      % cause all .m files to be reparsed when invoked again

这很不寻常,“bdclose”是用于关闭Simulink窗口的,与MEX文件无关(至少没有记录)。 - Amro
对我来说,bdclose all; 似乎只是在启动 Simulink 时需要一些时间,但并不能帮助重新加载 MEX。 - Alec Jacobson

1

清除 mex,这是你需要的吗?


@Thilo clear 是正确的答案,请查看文档以获取正确的语法。尝试使用 clear abs-path-to-mex-file。如果仍然无法解决问题,请查看 mex 命令在重新编译时如何从内存中卸载 mex 文件的 m 文件。 - Praetorian
@Praetorian:clear mex 可以起作用,但是它只能清除 mex 文件,而不能清除共享库。实际上,在 mex.m(或更好的 mex_helper.m)中,我找不到重新加载链接库的痕迹(搜索 unloadlib 没有得到重要结果)。 - Thilo

0

通过以下命令,您可以查看加载的共享库:

version('-modules')

我成功卸载了一个mex文件(以及它依赖的共享库),具体做法如下:
version('-modules')  % test.mexa64 and test.so appear
clear test           % clear the mex file
version('-modules')  % both test.mexa64 and test.so no longer appear.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接