C++ SDL停止创建stdout.txt和stderr.txt

C++ SDL停止创建stdout.txt和stderr.txt,c++,sdl,C++,Sdl,在过去的几个月里,我一直在使用SDL将输出定向到的stdout.txt和stderr.txt文件。我一直能够读取其中的调试信息,但从今天开始,不再创建文件。程序正常运行,但当执行停止时,文件消失。有人知道发生这种情况的简单原因吗?我正在使用Visual Studio 2012 编辑:stderr.txt文件刚刚开始再次出现。我想我找到了问题的根源。我在命令行参数中添加了/NODEFAULTLIB:library,因为我收到了以下警告消息: warning LNK4098: defaultlib

在过去的几个月里,我一直在使用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重定向输出?

在Windows上,当您构建SDL时,它会为您提供另一个名为
SDL.lib
的库(除了
SDL.lib

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

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

我不知道SDL怎么了。也许他们正在逐步淘汰这一功能

要自己实现它,可以使用
stdio.h
(或者最好是
cstdio
)头中的
freopen
函数调用

例如:

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

从这一点开始,所有
printf
等(所有写入
stdout
stderr
),甚至
cout
cerr
clog
都被重定向到您的文件中(我不确定
cout
的东西是否保证始终工作。)您应该在程序中尽早执行此操作,并且不要忘记关闭它们。

您自己构建SDL吗?您在编辑中提到的问题是由于所使用的CRT版本不同,最常见的原因是用于构建库和应用程序的VC版本不同,或者CRT类型不同(项目属性->C/C++->代码生成->运行时库)这种警告的另一个常见原因是使用“调试”库构建和“发布”应用程序构建,或者以其他方式。你能检查一下这不是正在发生的事吗?