我们有使用 mcc 编译成 DLL 的 matlab .m 文件。这由我们在 Visual Studio 中调试的 C++ GUI 应用程序使用。当我们到达对我们的 matlab 函数的调用时,我们所能做的就是跳过它。我们如何在源代码级别调试 .m 代码?
我认为添加一些“打印”语句(在 matlab 中实际上称为“disp”)并在 VS 的输出窗口中观察内容滚动会很容易。但我们什么也没看到。甚至不是来自 C++ 源代码中的 printf(),也不是直接从命令行而不是在 VS 中运行我们的应用程序。从 Google 和 S.O.,我们了解到发送到 stdout 的任何东西都不会出现在任何地方。 (这个问题是相关的:Visual Studio 2012 C++ Standard Output 但对我们不起作用。)
我在 .m 脚本中尝试了 msgbox('blah blah'),并重建了 DLL。什么都没有发生。我不确定这是否可行,但我们的 matlab 代码没有执行,或者 msgbox 是否不应该在这种情况下工作,比如 stdout。
我们对基于打印的调试很满意。断点和其他技术会很好,但目前没有必要。
我们在 Win7、Visual Studio 2015 上使用 Matlab R2016b。我们有用于制作 DLL 的 .m 源,我们有使用 DLL 的 GUI 应用程序的源。
最佳答案
几项:
当你调用你的 dll 的初始化例程时,调用 生成的“WithHandlers”版本:
YourDllInitWithHandlers( **, **)
。 '**' 是接受 matlab disp/warn/error 消息的函数的占位符,您可以路由到 stdout, 根据需要输出调试字符串或日志。您是否可能使用
-nojvm
选项从您的代码中初始化 mcr?如果是这样,将不会显示消息框。您不能进入已编译库的 .m 源代码。我们使用的两个选项是:(a) 将编译后的 m 代码的输入保存为 mat 文件,然后在您有空的时候在 Matlab 上加载和调试。 (b) 在调用已编译的 dll 和调用 Matlab-Engine 之间切换.该 API 集允许您启动、控制和调用完全交互式的 matlab 桌面。您可以像在常规 matlab session 中一样设置断点和步骤。这需要一些更多的设置代码,但非常方便调试。
关于c++ - 我们如何调试在 C++ 应用程序中使用的 matlab 制作的 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41274251/