mieki256's diary



2018/03/15(木) [n年前の日記]

#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の備忘録

以上です。

過去ログ表示

Prev - 2018/03 - Next
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