如何查看从 Matlab 中 Mex 函数使用的 DLL 调用的 printf 的输出?

Posted

技术标签:

【中文标题】如何查看从 Matlab 中 Mex 函数使用的 DLL 调用的 printf 的输出?【英文标题】:How can I see the output from printf's that are called from a DLL used by a Mex function in Matlab? 【发布时间】:2015-07-14 14:34:25 【问题描述】:

我有一些从 DLL 调用函数的 MEX 代码。 DLL 有一堆散落在各处的 printf 语句,它们对调试很有用。但是,我在 MATLAB 命令窗口中看不到它们的输出。我做了一些阅读,显然这是因为命令窗口不被视为可以发送 printf 输出的控制台应用程序。我试过使用这个link's 解决方案无济于事。我可以访问 DLL 的源代码。我正在为 Visual Studio 2010 中的 Windows 7 进行编译。我尝试使用 cout 并且有效;但是,我不想重写所有函数来使用 cout。有什么办法可以将 printf 的输出重定向到 MATLAB 的命令窗口?

【问题讨论】:

【参考方案1】:

您需要在 DLL 加载和初始化其运行时库之前调用SetStdHandle。您可以连接管道的写入端,并从另一端读取。

一旦运行时库初始化,它将拥有与原始标准输出句柄相关联的全局数据,并且可能不会受到未来对 SetStdHandle 的调用的影响。

【讨论】:

谢谢。我假设 DLL 在使用它的 mex 文件第一次运行时加载并初始化其运行时库,对吗?如果是这样,我会在哪里打电话给SetStdHandle @Damian:在调用 mex 函数之前? 如here 所示,在DLLMain 中执行此操作是否为时已晚?否则,如果没有使用实际 mec 文件的包装 mex 文件,我不明白如何做到这一点。 @Ben:mex 函数与我提到的库相关联。因此,每当我运行 mex 函数时,我假设它会加载 DLL。那么我应该在哪里运行 SetStdHandle? @chappjc:我明白你在说什么:将SetStdHandle 放入DLLMain,对吗?或者,我可以创建一个执行此操作的 Mex 文件并在开始时运行它。 SetStdHandle 是永久的吗?

以上是关于如何查看从 Matlab 中 Mex 函数使用的 DLL 调用的 printf 的输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GTK+2 C 代码中调用 matlab/octave 函数

如何找到 Matlab mex 文件的代码?

如何从 mex 函数返回矩阵结构?

从 Matlab 调用的 Mex 函数和数值差异

matlab中用于mex函数的安全、快速的CFLAGS

如何使用 Eclipse(4.20.0 版本)和 Matlab(R2021a)在 Windows 中编译 mex 函数