【问题标题】:Force MATLAB to reload library linked in mex function强制 MATLAB 重新加载在 mex 函数中链接的库
【发布时间】: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 上测试过)

标签: matlab mex


【解决方案1】:

clear mex 能满足你的需要吗?

【讨论】:

  • @Thilo clear 是正确的答案,请查看文档以了解正确的语法。试试clear abs-path-to-mex-file。如果没有任何效果,请在 m 文件中挖掘 mex 命令,看看当您重新编译一个时,Matlab 如何卸载内存中的 mex 文件。
  • @Praetorian: clear mex 有效,但 清除共享库,而只清除 mex 文件。事实上,我在mex.m(或者更好的mex_helper.m)中找不到链接库被重新加载的任何痕迹(搜索unloadlib 不会产生重大影响)。
【解决方案2】:

要从内存中清除一个库,我通常会很幸运

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 文件无关(至少没有记录)..
  • 对我来说,bdclose all; 启动 simulink 似乎需要一些时间,但无助于重新加载 mex。
【解决方案3】:

您可以通过以下操作查看加载了哪些共享库:

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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2016-01-31
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多