【发布时间】:2013-06-22 05:03:35
【问题描述】:
我有一个 Mex 函数,比如 myfunction.mexmaci64(这是 OS X 上的正确结尾)。
现在,myfunction 链接到库 mylibrary.dylib。 mex 文件和库都位于同一个文件夹中。
现在,每当我在 mylibrary 中更改某些内容时,MATLAB 不会重新加载新的库版本,而是使用旧版本,直到我重新启动 MATLAB。在进行开发和调试工作时,这是非常令人讨厌的。
有没有办法强制 MATLAB 在不重新启动应用程序的情况下重新加载库?
注意:将库静态链接到 mex 函数会很容易。但是,由于我在很多 mex 文件中链接同一个库,我更愿意保留我的单个共享库以减少编译时间和数据冗余。
编辑:
关于clear mex 是否有帮助的讨论:
[~, loaded_mexes] = inmem('-completenames'); % get canonica
返回一个包含所有加载的 mex 文件的列表。此列表不包含链接库,而仅包含 mex 文件本身。使用clear mex 成功清空了这个列表,但不会卸载mylibrary - 再次运行 mex 函数仍然会产生与旧共享库相同的输出。
【问题讨论】:
-
unloadlibrary()可以选择吗? mathworks.de/de/help/matlab/ref/unloadlibrary.html -
@H.Muster 也许
unloadlibrary()可以提供帮助,是的。但是,我不知道如何使用它。仅使用我的库路径调用它只会返回Could not find file mylibrary.dylib。此外,该文档还列出了限制Use with libraries that are loaded using the loadlibrary function.。可能 mex 文件不使用loadlibrary(我从不提供loadlibrary所需的头文件。 -
@Thilo 我只需要处理卸载 mex 函数本身,而不是它引用的库。我假设一旦 MATLAB 卸载了 mex 文件,操作系统就会为你卸载它。你如何链接到
mylibrary?链接器是在为您进行绑定(当您编译 mex 函数时),还是在使用dlopen()?如果是后者,需要拨打dlclose()。也许注册一个mexAtExit函数,您可以在其中进行此调用。 -
@Thilo:
inmem仅显示内存中加载的 MEX 函数,而不是外部依赖项。在 Windows 上,您可以使用feature dumpmem查看 MATLAB 加载的所有 DLL(包括它自己的) -
Mex function not updated after recompile 的可能副本。上次我对此进行调查时,无法重现该问题。结论是链接的共享库没有释放其所有资源,因此保留在内存中(或者这种行为是特定于平台的,我在 Windows 上测试过)