如何查看从 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 的输出?的主要内容,如果未能解决你的问题,请参考以下文章