2018/03/15(木) [n年前の日記]
#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の備忘録
[ ツッコむ ]
以上です。