【问题标题】:How to recompile model DLL without restarting MATLAB?如何在不重新启动 MATLAB 的情况下重新编译模型 DLL?
【发布时间】:2013-12-18 15:17:37
【问题描述】:

我正在开发一个 SFunction 并在 Simulink 中编译子模型,这是一个调用使用 Realtime Workshop 编译的 DLL 的 SFunction。问题是,一旦我编译了一次子模型,通过 SFunction 在本机 Simulink 中执行它并且模型完成,MATLAB 仍然保留子模型 DLL 的句柄。在 MATLAB 重新启动之前,我无法重新编译 DLL,从而强制释放 DLL。

我什至去看看 ProcessExplorer 是否可以强制关闭句柄,但它不能。

【问题讨论】:

  • 你试过关闭模型吗?这有什么不同吗?另外,您在关闭模型后尝试过clear functions 吗?它应该从内存中清除所有 MEX 函数。
  • 已尝试:(1) 清除 ,(2) 清除 mex,(3) 清除所有,(4) bdclose all,(5) unloadlibrary(),(6)关闭模型,(7)关闭所有模型; (8) 使用 SysInternals ProcessExplorer 关闭句柄; (9) 使用 Unlocker 解锁/删除 DLL 和 (10) 在 SFunction 结束时调用 FreeLibrary()。这些似乎都不会影响问题。
  • :-( 比我尝试过的要多...抱歉,没有其他想法。
  • islibloaded('LIBNAME') 返回什么?
  • 你如何加载/调用你的dll?你在你的 mdlTerminate 函数中完成后卸载它吗?

标签: matlab simulink


【解决方案1】:

如何将 S-Function 绑定到 DLL?如果您在链接时绑定,那么您可以尝试bind at runtime 并显式释放mdlTerminate 中的句柄。这样,MATLAB 甚至都不应该知道您访问了 DLL。当然,这使得在 S-Function 中与 DLL 的实际交互变得更加混乱。

【讨论】:

  • 这与我目前得到的答案非常接近,分别在 mdlStart 和 mdlTerminate 上调用 LoadLibrary() 和 FreeLibrary()。第一次尝试使用它导致了分段违规,所以有点紧张,但从那时起它就开始起作用了。
  • @JCollins:只需确保通过将 DLL 句柄存储在工作向量中(而不是使用全局变量)来保持 S-Function 可重入。那你应该没事。
【解决方案2】:

我认为如果您将实际的 DLL 重命名为其他名称然后重新编译,它会起作用。我知道它适用于mex 文件。如果这不起作用,你可以试试这个solution

【讨论】:

  • Windows 不允许重命名,因为 MATLAB.exe 有一个 DLL 句柄。
猜你喜欢
  • 2011-04-07
  • 2013-12-02
  • 2014-01-28
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 2013-06-06
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多