0

在过去的几个月里,我一直在使用 SDL 将输出定向到的 stdout.txt 和 stderr.txt 文件。我一直能够阅读其中的调试信息,但从今天开始,不再创建这些文件。程序正常运行,但当执行停止时,文件消失。有谁知道为什么会发生这种情况的简单原因?我正在使用 Visual Studio 2012。

编辑: stderr.txt 文件刚刚开始再次出现。我想我找到了问题的根源。我已将 /NODEFAULTLIB:library 添加到命令行参数,因为我收到以下警告消息:

warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; 
use/NODEFAULTLIB:library

当我删除命令时,输出文件再次开始出现,但我仍然收到警告消息。谁可以给我解释一下这个?我应该忽略警告,还是有办法摆脱警告,但保留 SDL 重定向输出?

4

1 回答 1

0

在 Windows 上,当您构建 SDL 时,它会为您提供另一个SDL.lib名为SDLmain.lib.

您可以构建这个库,这样它就不会将标准流重定向到文件。它使用预处理器定义NO_STDIO_REDIRECT,即,当定义此符号时,标准流不会重定向到文件。

因此,如果您自己构建 SDL,您可以检查您的解决方案文件以查看此符号是否在某处定义。我刚刚检查了 SDL 源代码中提供的解决方案,而 VC11 (Visual Studio 2012) 之前的版本确实具有构建带有和不带有 STDIO 重定向的 SDLmain 的配置,而 VC11 解决方案没有

我不知道 SDL 发生了什么。也许他们正在逐步淘汰此功能。

要自己实现它,您可以使用来自(或最好是)标头的freopen函数调用。stdio.hcstdio

例如:

FILE * my_stdout = freopen ("my_stdout.txt", "wb" /*or "wt"*/, stdout);
FILE * my_stderr = freopen ("my_stderr.txt", "wb" /*or "wt"*/, stderr);

从这一点开始, allprintf等(所有写入stdoutand stderr,)甚至coutandcerrclog被重定向到您的文件(我不确定这些cout东西是否保证始终有效。)您应该尽早执行此操作你的程序,不要忘记fclose他们。

于 2013-06-23T22:39:45.067 回答