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ます。

標準ストリームを files にリダイレクトしないように、このライブラリを構築できます。プリプロセッサ定義を使用します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, への書き込み)coutおよびcerrandclogもファイルにリダイレクトされます (それらが常に機能することが保証されているかどうかはcoutわかりません)。できるだけ早くこれを行う必要があります。あなたのプログラム、そしてそれらを忘れないでfcloseください。

于 2013-06-23T22:39:45.067 に答える