2018/03/15(木) [n年前の日記]
#1 [windows][ruby][mruby] SDL2を使うとコンソール出力がされなくなる問題について追記
Windows上で、SDL2 を使って、-mwindows を指定してビルドしたプログラムは、printf() が使えなくなる ―― コンソール出力ができなくなるけれど。SDL_Log("hoge") を使えば、-mwindows をつけてビルドしても、コンソール出力っぽいことができるようだと分かった。とメモ。
ただ、DOS窓上で実行した際は、SDL_Log("hoge") でメッセージを出力した後、何かプロセス?が残る…ような気がする。Ctrl + C を押してからじゃないと、DOS窓が exit で閉じてくれない状態になる模様。
それと、sdl2-config --libs の出力結果内に、-mwindows の指定があることに今頃気づいた。
数日前に mruby-sdl2 をビルドしようとした際は、sdl2-config --libs の出力結果をそのままコピペして使っていたから、-mwindows も指定してしまっていたわけで。だから、mruby や mirb がコンソールアプリではなくGUIアプリになってしまって、実行しても何一つメッセージを出力できない状態になっていたのではないか。と想像してみたけれど、さてどうなんだろう。
ただ、DOS窓上で実行した際は、SDL_Log("hoge") でメッセージを出力した後、何かプロセス?が残る…ような気がする。Ctrl + C を押してからじゃないと、DOS窓が exit で閉じてくれない状態になる模様。
それと、sdl2-config --libs の出力結果内に、-mwindows の指定があることに今頃気づいた。
数日前に mruby-sdl2 をビルドしようとした際は、sdl2-config --libs の出力結果をそのままコピペして使っていたから、-mwindows も指定してしまっていたわけで。だから、mruby や mirb がコンソールアプリではなくGUIアプリになってしまって、実行しても何一つメッセージを出力できない状態になっていたのではないか。と想像してみたけれど、さてどうなんだろう。
[ ツッコむ ]
#2 [windows][ruby][mruby] MSYS2 と SDL2 についてメモ
MSYS2 と SDL2 について分かったことをもう少しメモ。
◎ MSYS2上から出来上がった .exe を実行できた。 :
以前、MSYS2上(mintty上)から、ビルドして出来上がった .exe を実行できないとメモしたけれど。
ふと、うっかり、*NIXを使ってる感覚になってしまって、hoge.exe と打ち込まず、./hoge.exe と打ち込んだら、実行できてしまった。とメモ。
なんで? そういうものなの?
ふと、うっかり、*NIXを使ってる感覚になってしまって、hoge.exe と打ち込まず、./hoge.exe と打ち込んだら、実行できてしまった。とメモ。
なんで? そういうものなの?
◎ dllの在り処。 :
MSYS2 の場合、/mingw32/bin/ 以下に SDL2 関係のdllが入ってる模様。pacman -S で、SDL2関係のアレコレをインストールした場合の話だけど。
実際は、これだけでは動作に足りないはず…。おそらく、以下の .dll が必要になりそう。SDL2_image を利用してpng画像を使ったり、oggを再生したりするなら、だけど。
$ ll /mingw32/bin/SDL2* -rwxr-xr-x 1 mieki256 None 1113744 3月 5 14:46 /mingw32/bin/SDL2.dll -rwxr-xr-x 1 mieki256 None 136476 3月 5 14:54 /mingw32/bin/SDL2_image.dll -rwxr-xr-x 1 mieki256 None 142633 11月 9 14:24 /mingw32/bin/SDL2_mixer.dll -rwxr-xr-x 1 mieki256 None 29622 1月 10 2016 /mingw32/bin/SDL2_net.dll -rwxr-xr-x 1 mieki256 None 38303 4月 6 2016 /mingw32/bin/SDL2_ttf.dll
実際は、これだけでは動作に足りないはず…。おそらく、以下の .dll が必要になりそう。SDL2_image を利用してpng画像を使ったり、oggを再生したりするなら、だけど。
libFLAC-8.dll libfreetype-6.dll libjpeg-9.dll libmodplug-1.dll libmpg123-0.dll libogg-0.dll libpng16-16.dll libtiff-5.dll libvorbis-0.dll libvorbisfile-3.dll libwebp-4.dll libwebp-7.dll SDL2.dll SDL2_gfx.dll SDL2_image.dll SDL2_mixer.dll SDL2_net.dll SDL2_ttf.dll smpeg2.dll zlib1.dllビルドして出来上がった .exe が置いてある場所に、上記のdllもコピーしてしまえば配布できるようになるのだろうか。
◎ libgcc_s_dw2-1.dllが必要らしい。 :
出来た .exe を他のPC(Windows8.1機)に持っていって実行してみたら、「libgcc_s_dw2-1.dllがねえよ」と怒られてしまった。そんなファイルも必要になるのか…。
g++ のオプションに、-static-libgcc -static-libstdc++ を指定すると静的リンク(スタティックリンク)になる、という話も見かけたけれど、試してみても効果が無い。exe のファイルサイズは以前と変わらず。なんでだろ。
_MinGWでlibgomp-1.dllがstatic linkできない問題(gcc, OpenMP) - Qiita
_Windows-アプリケーション/MinGW-MSYS/MinGWでのビルド - yanor.net/wiki
他にも、-static -static-libgcc -static-libstdc++ をつけると良い、という話も見かけたけれど、試してみたら SDL2 関係で大量にエラーが出た。うーん。
仕方ないので、/mingw32/bin/ 以下から、libgcc_s_dw2-1.dll をコピーしてきたけれど。その状態で実行したら、今度は「libwinpthread-1.dll が無いぞ」と怒られた。ソレも必要なのか…。コレも、/mingw32/bin/ 以下から、libwinpthread-1.dll をコピーしてみるか…。
各dllをコピーしてきた状態なら、他のPC上でも一応動いた。
しかし、一々dllをコピーするのは面倒だな…。スタティックリンクとやらをしてみたい…。
g++ のオプションに、-static-libgcc -static-libstdc++ を指定すると静的リンク(スタティックリンク)になる、という話も見かけたけれど、試してみても効果が無い。exe のファイルサイズは以前と変わらず。なんでだろ。
_MinGWでlibgomp-1.dllがstatic linkできない問題(gcc, OpenMP) - Qiita
_Windows-アプリケーション/MinGW-MSYS/MinGWでのビルド - yanor.net/wiki
他にも、-static -static-libgcc -static-libstdc++ をつけると良い、という話も見かけたけれど、試してみたら SDL2 関係で大量にエラーが出た。うーん。
仕方ないので、/mingw32/bin/ 以下から、libgcc_s_dw2-1.dll をコピーしてきたけれど。その状態で実行したら、今度は「libwinpthread-1.dll が無いぞ」と怒られた。ソレも必要なのか…。コレも、/mingw32/bin/ 以下から、libwinpthread-1.dll をコピーしてみるか…。
各dllをコピーしてきた状態なら、他のPC上でも一応動いた。
しかし、一々dllをコピーするのは面倒だな…。スタティックリンクとやらをしてみたい…。
[ ツッコむ ]
#3 [ruby][windows][mruby] MSYS2 + SDL2 でビルドする際のスタティックリンクができた
Windows10 x64 + MSYS2 + SDL2 でビルドして作った exeファイルを他のPCに持っていく際、一々 dll までコピーするのは面倒臭い。そのあたり、exe にスタティックリンクされた状態にしてみたい。
少し試してみたけれど、コンパイラだかリンカだかにオプションを渡す際、-static というオプションをつけると、使うライブラリを全部スタティックリンクしてくれるらしい。ただ、必要になるライブラリを、全部 -l〜 で列挙しないといけないようで。
今回は、以下のような Makefile にしてみたところ、exe のみを他のPCに持っていっても、ちゃんと動いてくれた。
_Makefile
Cソースと使用画像は以下。
_sdl2imagetest.c
_sample.png
ちなみに、上記ソースの実行結果は以下。
結構滑らかに動いてる。
少し試してみたけれど、コンパイラだかリンカだかにオプションを渡す際、-static というオプションをつけると、使うライブラリを全部スタティックリンクしてくれるらしい。ただ、必要になるライブラリを、全部 -l〜 で列挙しないといけないようで。
今回は、以下のような Makefile にしてみたところ、exe のみを他のPCに持っていっても、ちゃんと動いてくれた。
_Makefile
TARGETS = sdl2imagetest all: $(TARGETS) SDL_PREFIX = /mingw32 # SDL_PREFIX = /mingw # SDL_CONFIG = $(SDL_PREFIX)/bin/sdl2-config SDL_CONFIG = sdl2-config CG_LIBS = CROSS_COMPILE = $(SDL_PREFIX)/bin/ CC = $(CROSS_COMPILE)gcc CXX = $(CROSS_COMPILE)g++ # CFLAGS = -g -Wall `$(SDL_CONFIG) --cflags` # CXXFLAGS = -g -Wall `$(SDL_CONFIG) --cflags` CFLAGS = -g -Wall -I$(SDL_PREFIX)/include/SDL2 -Dmain=SDL_main CXXFLAGS = -g -Wall -I$(SDL_PREFIX)/include/SDL2 -Dmain=SDL_main # LDFLAGS = `$(SDL_CONFIG) --libs` -Wl,-rpath,$(SDL_PREFIX)/lib LDFLAGS = -L$(SDL_PREFIX)/lib -lmingw32 -lSDL2main -lSDL2 -mwindows -Wl,-rpath,$(SDL_PREFIX)/lib # LIBS = -lopengl32 -lglu32 -lm -lSDL2_image LIBS = -lSDL2_image -lpng -lz -ljpeg -ltiff -lwebp -llzma -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lopengl32 -lglu32 -lpthread -static -static-libgcc -static-libstdc++ clean: rm -f *.o *.a *~ $(TARGETS) sdl2imagetest: sdl2imagetest.o $(CXX) -o $@ $^ $(LDFLAGS) $(LIBS)
Cソースと使用画像は以下。
_sdl2imagetest.c
_sample.png
ちなみに、上記ソースの実行結果は以下。
結構滑らかに動いてる。
◎ Makefileの内容についてメモ。 :
Makefile 内では、おそらく以下の指定がしてあるのだろう…。自分、Makefileの書き方はほとんど把握できてないので怪しいけど。
本来、リンクしたいアレコレは LIBS に指定して、フラグ関係は LDFLAGS に指定するのではないか、という気もしてるのだけど…。ビルドできたから、いいか。
それと、ライセンスの問題が気になる。中には、スタティックリンクを許していないライセンスになっている何かもあったりするのではないか…。GPL とか LGPL とかありそうな。そのあたり、以下のページで解説されてる。のかな。
_Debian/Ubuntuでmingw-w64を用いてWindows向けのプログラムをコンパイルする - kakurasan
- TARGETS が、最終的に欲しい何かの名前。
- MSYS2 32bit で使うときは、SDL_PREFIX を /mingw32 に、MinGW + MSYS で使うときは、/mingw に変更。
- CFLAGS , CXXFLAGS に列挙してるのは、sdl2-config --cfalgs の出力結果。
- LDFLAGS に列挙してるのは、sdl2-config --libs の出力結果。
- LIBS に、必要になるらしいライブラリを -l〜 の形で列挙。かつ、最後のほうに -static -static-libgcc -static-libstdc++ を記述。
- libpng を使うときは、-lpng。zlibを使うときは -lz。libjpeg を使うときは -ljpeg。なのかな。たぶん。
- MSYS2 でビルドした何かは libwinpthread-1.dll を必要とするけれど。それもスタティックリンクしたいときは、-lpthread を追加して、-static も追加。なのだろうか。
- gcc だか g++ だかは、dllファイル名を直接指定するオプションも存在してるっぽいのだけど、まだそこまで調べてない。(2018/03/18追記。スタティックリンクするためには lib〜.aが必要らしい。dllファイルだけがあってもスタティックリンクはできない。となると、自分がどこかで見かけたdllの指定、アレは何だったのか…。)
本来、リンクしたいアレコレは LIBS に指定して、フラグ関係は LDFLAGS に指定するのではないか、という気もしてるのだけど…。ビルドできたから、いいか。
それと、ライセンスの問題が気になる。中には、スタティックリンクを許していないライセンスになっている何かもあったりするのではないか…。GPL とか LGPL とかありそうな。そのあたり、以下のページで解説されてる。のかな。
_Debian/Ubuntuでmingw-w64を用いてWindows向けのプログラムをコンパイルする - kakurasan
◎ 参考ページ。 :
動作に必要になるらしいライブラリの一覧は、以下を参考にした。
_Eclipse+MinGWでSDL2を静的リンクさせる覚書 - Qiita
_c - How to install libpng correcly? - Stack Overflow
Makefile は、以下を参考にした。
_MSYS2 + MinGW 環境に SDL2 をインストール - takaya030の備忘録
_Eclipse+MinGWでSDL2を静的リンクさせる覚書 - Qiita
_c - How to install libpng correcly? - Stack Overflow
Makefile は、以下を参考にした。
_MSYS2 + MinGW 環境に SDL2 をインストール - takaya030の備忘録
[ ツッコむ ]
#4 [nitijyou] 某所に行ってきた
インターネットに接続できないというトラブル相談。10:30-15:00まで作業。詳細はGRPでメモ。
[ ツッコむ ]
以上、1 日分です。