2018/03/14(水) [n年前の日記]
#2 [windows][ruby][mruby] SDL2を使うとコンソール出力がされなくなる問題
 Windows10 x64 + MSYS2 で、SDL2 を使ったソースをビルドして動作確認していたのだけど。ソース内で printf() を書いてもDOS窓に何も出力されなくて悩んだり。一般的にはコンソール出力という呼び方でいいのだろうか。アレができない。
ググってみたら、どうもコンパイラだかリンカに渡すオプションが関係していたようで。
_c++ - How do I print to the console while an SDL 2 program is running? - Stack Overflow
_c++ - No stdout.txt with SDL - Stack Overflow
_windows - C printf() on win32 with mingw - Stack Overflow
「-mwindows」というオプションをつけると、コンソールアプリではなくGUIアプリとして生成されて、コンソール出力ができなくなるっぽい。外してみたら、printf() が働いて、DOS窓にメッセージが出力されるようになった。
-mconsole を指定する方法もあるらしいが、そちらは試してない。
_How to output to the console in C++/Windows - Stack Overflow
また、昔の SDL は、stdout.txt や stderr.txt というファイルが作られて、出力結果がそれらファイルに書き込まれる仕様になっていた、と知った。
_FAQ_Windows_Where_stdout_/_stderr - SDL Documentation Wiki
_SDLスレ ver.2.0
ただ、今現在の SDL2 は、そういう仕様にはなってない、ような気がする。.exe と同じ場所に (stdout|stderr).txt は作られてないし。
ちなみに、freopen() を使えば、そういったファイルを作成して出力することも可能なようで。一応、以下のような記述で、stdout.txt が作成され、出力結果が保存されることは確認できた。
とりあえず、*.c をビルドするだけの場面なら、上記について気を付ければどうにかなりそう。
しかし、Windows10 x64 + MSYS2 上で mruby-sdl2 をビルドすると、コンソール出力できなくなる理由は相変わらず分からないまま。-mwindows なんてオプションは指定してないと思うのだけどな…。*NIX上でビルドすると、コンソール出力されるし…。
 ググってみたら、どうもコンパイラだかリンカに渡すオプションが関係していたようで。
_c++ - How do I print to the console while an SDL 2 program is running? - Stack Overflow
_c++ - No stdout.txt with SDL - Stack Overflow
_windows - C printf() on win32 with mingw - Stack Overflow
「-mwindows」というオプションをつけると、コンソールアプリではなくGUIアプリとして生成されて、コンソール出力ができなくなるっぽい。外してみたら、printf() が働いて、DOS窓にメッセージが出力されるようになった。
-mconsole を指定する方法もあるらしいが、そちらは試してない。
_How to output to the console in C++/Windows - Stack Overflow
また、昔の SDL は、stdout.txt や stderr.txt というファイルが作られて、出力結果がそれらファイルに書き込まれる仕様になっていた、と知った。
_FAQ_Windows_Where_stdout_/_stderr - SDL Documentation Wiki
_SDLスレ ver.2.0
ただ、今現在の SDL2 は、そういう仕様にはなってない、ような気がする。.exe と同じ場所に (stdout|stderr).txt は作られてないし。
ちなみに、freopen() を使えば、そういったファイルを作成して出力することも可能なようで。一応、以下のような記述で、stdout.txt が作成され、出力結果が保存されることは確認できた。
  window = SDL_CreateWindow("SDL2 Window",
                            100, 100,
                            640, 480, 0);
  if (window == NULL)
  {
    FILE *fp;
    fp = freopen("stdout.txt", "w", stdout);
    printf("Could not create window: %s\n", SDL_GetError());
    fclose(fp);
    SDL_Quit();
  }
  else
  {
    FILE *fp;
    fp = freopen("stdout.txt", "w", stdout);
    printf("create window\n");
    fclose(fp);
  }
とりあえず、*.c をビルドするだけの場面なら、上記について気を付ければどうにかなりそう。
しかし、Windows10 x64 + MSYS2 上で mruby-sdl2 をビルドすると、コンソール出力できなくなる理由は相変わらず分からないまま。-mwindows なんてオプションは指定してないと思うのだけどな…。*NIX上でビルドすると、コンソール出力されるし…。
◎ 2018/03/15追記。 :
_2018/03/15の日記
に、この件に関する補足を書いた。とメモ。
[   ツッコむ ]
以上です。