mieki256's diary



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アプリになってしまって、実行しても何一つメッセージを出力できない状態になっていたのではないか。と想像してみたけれど、さてどうなんだろう。

#2 [windows][ruby][mruby] MSYS2 と SDL2 についてメモ

MSYS2 と SDL2 について分かったことをもう少しメモ。

MSYS2上から出来上がった .exe を実行できた。 :

以前、MSYS2上(mintty上)から、ビルドして出来上がった .exe を実行できないとメモしたけれど。

ふと、うっかり、*NIXを使ってる感覚になってしまって、hoge.exe と打ち込まず、./hoge.exe と打ち込んだら、実行できてしまった。とメモ。

なんで? そういうものなの?

dllの在り処。 :

MSYS2 の場合、/mingw32/bin/ 以下に SDL2 関係のdllが入ってる模様。pacman -S で、SDL2関係のアレコレをインストールした場合の話だけど。
$ 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をコピーするのは面倒だな…。スタティックリンクとやらをしてみたい…。

#3 [ruby][windows][mruby] MSYS2 + SDL2 でビルドする際のスタティックリンクができた

Windows10 x64 + MSYS2 + SDL2 でビルドして作った exeファイルを他のPCに持っていく際、一々 dll までコピーするのは面倒臭い。そのあたり、exe にスタティックリンクされた状態にしてみたい。

少し試してみたけれど、コンパイラだかリンカだかにオプションを渡す際、-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の書き方はほとんど把握できてないので怪しいけど。
  • 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の備忘録

#4 [nitijyou] 某所に行ってきた

インターネットに接続できないというトラブル相談。10:30-15:00まで作業。詳細はGRPでメモ。

以上、1 日分です。

過去ログ表示

Prev - 2018/03 -
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project