mieki256's diary



2024/01/29(月) [n年前の日記]

#1 [basic] FreeBASICでSDL 1.xを使ってみたかった

_昨日、 FreeBASIC + ゲーム制作用ライブラリ raylib を試用してみたけれど。ゲーム制作用ライブラリなら SDL があるのではないか、FreeBASIC から SDL も使えるらしいのでそちらを使うのもアリではないのかと思えてきた。

でも、本当に FreeBASIC からSDLを使えるのだろうか。気になったので、少し試してみた。

環境は Windows10 x64 22H2 + FreeBASIC 1.10.1 32bit。

サンプルファイルの在処 :

FreeBASICには、SDL 1.x/2.xを使うサンプルファイルが同梱されてる。examples/graphics/SDL/*.bas がサンプルファイル群。

_fbc/examples/graphics/SDL at master - freebasic/fbc

コレが動けば、FreeBASIC + SDL が使える状態になっていると言えそう。

ちなみに、サンプル中の、sdl2-hello.bas だけが SDL2 を使うサンプルで、それ以外は SDL 1.x を使っているサンプルになっている。

要求されるバージョン :

FreeBASICインストールフォルダ/inc/SDL/ に、SDL 1.x用のヘッダーファイルがある。

_fbc/inc/SDL at master - freebasic/fbc

各ヘッダーファイル内に、当時対象にしていたのであろう、SDLのバージョンが書いてあったのでメモしておく。バージョンを合わせておいたほうがハマらずに済みそう。

SDL.bi       : SDL-1.2.15
SDL_image.bi : SDL_image-1.2.12
SDL_mixer.bi : SDL_mixer-1.2.12
SDL_ttf.bi   : SDL_ttf-2.0.11
SDL_net.bi   : SDL_net-1.2.8

SDL_gfx_framerate.bi       : SDL_gfx-2.0.26
SDL_gfx_imageFilter.bi     : SDL_gfx-2.0.26 
SDL_gfx_primitives.bi      : SDL_gfx-2.0.26
SDL_gfx_primitives_font.bi : SDL_gfx-2.0.26
SDL_gfx_rotozoom.bi        : SDL_gfx-2.0.26


ついでなので、SDL2用ヘッダーファイルに書かれていた SDL2のバージョンもメモしておく。

_fbc/inc/SDL2 at master - freebasic/fbc

SDL.bi       : SDL2-2.0.14
SDL_image.bi : SDL2_image-2.0.5
SDL_Mixer.bi : SDL2_mixer-2.0.4
SDL_net.bi   : SDL2_net-2.0.1
SDL_ttf.bi   : SDL2_ttf-2.0.15

SDL2_gfx_framerate.bi       : SDL2_gfx-1.0.4
SDL2_gfx_imageFilter.bi     : SDL2_gfx-1.0.4
SDL2_gfx_primitives.bi      : SDL2_gfx-1.0.4
SDL2_gfx_primitives_font.bi : SDL2_gfx-1.0.4
SDL2_gfx_rotozoom.bi        : SDL2_gfx-1.0.4

必要になるファイル :

FreeBASICから SDL 1.x/2.x を使うためには、MinGW用ライブラリファイル libsdl*.a と、SDLのランタイムファイル SDL*.dll が必要になる。

ランタイムファイル SDL*.dll については、公式サイトで配布されているので容易に入手できる。

_SDL - Index of /release
_SDL_image - Index of /projects/SDL_image/release
_SDL_mixer - Index of /projects/SDL_mixer/release
_SDL_ttf - Index of /projects/SDL_ttf/release
_SDL_net - Index of /projects/SDL_net/release

例えば SDL 1.2.15 の場合、以下の2つのファイルに .dll が入っている。x64とついているのが 64bit版。ついてないのが 32bit版。
SDL-1.2.15-win32.zip
SDL-1.2.15-win32-x64.zip
SDL_image や SDL_mixer 等も、上記と似たようなファイル名になっている。


問題は、MinGW用ライブラリ、libsdl*.a。このファイルの入手が難しい…。

配布ファイル名が「SDL*-devel-*-mingw*.tar.gz」になってたら、そのファイルの中にMinGW用ライブラリが入ってる可能性が高い。例えば以下のファイルには、MinGW用ライブラリが入ってる。
SDL-devel-1.2.15-mingw32.tar.gz
SDL2-devel-2.0.14-mingw.tar.gz
SDL2_image-devel-2.0.5-mingw.tar.gz

しかし…。
  • SDL2.x用ならMinGW用ライブラリも配布されているけれど、SDL 1.x 用は配布されてない。
  • SDL 1.x 本体だけは上記のように配布されているけれど、それ以外、SDL_image や SDL_Mixer等は用意されてない。
SDL 1.x 関係は、ソースファイル、ランタイム、Visual C++用ライブラリファイルしか入手できない。

知識のある人なら、MinGW や MSYS2 を使って、ソースファイルからビルドしてライブラリファイルをゲットできるのだろうけど…。

結論を先に書く。Visual C++用ライブラリ(*.lib)を、MinGW用ライブラリ(*.a)に変換できる reimp.exe というツールがMinGWに用意されてるので、ソレを使って MinGW用ライブラリを用意するのが一番楽。かもしれない。たぶん。

とりあえず、reimp を使って .lib から .a に変換した、SDL関連 MinGW用ライブラリ一式(32bit版のみ)を、zipでまとめて置いておきます。

_sdl_1x_win32_x86_lib_to_a.zip

これを解凍して、*.a と *.dll を、FreeBASIC + SDL 1.x を使うプロジェクトフォルダにごっそりコピーすればどうにかなるかなと…。

動作確認 :

こうして用意できた .a と .dll 群を、examples/graphics/SDL/ の中にコピーして、fbc32 xxxx.bas でコンパイルしていった。

_fbc/examples/graphics/SDL at master - freebasic/fbc

mouse.bas 以外はコンパイルが通って、動作してくれた。

mouse.bas だけコンパイルできない点は少し気になるけど…。ほとんどは動いてくれたから、まあいいか…。

reimpについて :

以降は、自分で lib*.a を用意したい場合の作業メモ。

Visual C++用ライブラリは拡張子が .lib。MinGW用ライブラリは拡張子が .a。そのままでは Visual C++ のライブラリを MinGW で使えない。 *1

しかし、MinGW の mingw-utils の中に、reimp.exe というツールがあって、コレを使うと .lib を .a に変換できる(可能性がある)と知った。

_MinGW - Minimalist GNU for Windows - Browse /MinGW/Extension/mingw-utils at SourceForge.net
_ohai日誌(2007-03-05)
_ソフトに関する雑記

ただ、注意点がある。mingw-utils は 0.4-1 以外を使うこと。

今回、手元の環境に mingw-utils-0.4-1 が入っていたので、reimp が使えるか試してみたのだけど、変換できないと言われてしまった。
> reimp SDL_mixer.lib
reimp: SDL_mixer.lib: invalid or corrupt import library

どの .lib も全く変換できないのでおかしいなと思ったら、mingw-utils-0.4-1 に入ってる版はバグがあるそうで…。

_MinGW GCC toolchain (Win) - TrinityCore - Confluence
If you are getting errors with the reimp command, you may need to rebuild the mingw-utils-0.4-1 package from source as the binary distribution contains a bug.

MinGW GCC toolchain (Win) - TrinityCore - Confluence より


mingw-utils-0.3 (mingw-utils-0.3.tar.gz) を入手して、その中に入っている reimp.exe を使ってみたら、あっさり .lib から .a に変換できてしまった…。こんな罠があるとは…。

SDL 1.x関連の.libを変換 :

以下のSDL関連ファイルを入手して、中に入っていた .libを変換した。
SDL_image-devel-1.2.12-VC.zip
SDL_mixer-devel-1.2.12-VC.zip
SDL_net-devel-1.2.8-VC.zip
SDL_ttf-devel-2.0.11-VC.zip

reimp SDL_image.lib
reimp SDL_mixer.lib
reimp SDL_net.lib
reimp SDL_ttf.lib

変換すると、.a と .def が生成される。
  • .a がMinGW用ライブラリ。
  • .def は、dlltool というツール用のファイル。

dlltool に .defファイルを渡してやることで、.dll の各機能を呼び出すためのライブラリ(lib*.a)を生成できるらしい。今回は lib*.a が reimp で得られたから、.def は必要ないとは思うけど…。

_dllからインポートライブラリを作成する方法

SDL本体は公式配布版を使う :

SDL本体だけはMinGW用ライブラリが配布されていたので、ソレをそのまま使うことにした。
SDL-devel-1.2.15-mingw32.tar.gz

_SDL - Index of /release

以下の2つのファイルを使う。
libSDL.dll.a
libSDLmain.a

余談。前述のファイルを解凍すると、ファイル名の先頭が「.」になってるファイルがたくさん入ってた。たぶんコレ、Mac用じゃないかなと…。無視して構わない。

SDL_gfxだけはビルドした :

SDL_gfx は Visual C++用ライブラリすら無かったので、MinGW (gcc 6.3.0) を使ってビルドした。

本来は .a と .dll の両方が必要になるけれど、FreeBASIC 1.10.1 32bit版の lib/ には、標準状態でも、libSDL_gfx.dll.a だけは同梱されていた。だから、プロジェクトフォルダ内に SDL_gfx.dll だけ置いておけば SDL_gfx を使える。つまり今回は SDL_gfx.dll を得るためだけにビルドする。

_SDL_gfx / SDL2_gfx - ferzkopp.net

SDL_gfx-2.0.26.tar.gz を入手して解凍。

中に Makefile.mingw という、MinGW用の Makefile があるのでソレを使ってビルドする。ただ、何ヶ所か修正しないといけない。
  • prefix には MinGWインストールフォルダを指定しないといけない。…もしかして make に渡すオプションで変更できたりする?
  • SDL_gfxBlitFunc.o というファイルもコンパイルしてリンクしてやる。

> diff Makefile.mingw.orig Makefile.mingw -u
--- Makefile.mingw.orig Tue Dec 22 12:00:31 2009
+++ Makefile.mingw      Mon Jan 29 05:16:00 2024
@@ -2,7 +2,7 @@
 AR=ar rc
 RANLIB=ranlib

-prefix=c:/dev
+prefix=D:/MinGW
 bin_dir=$(prefix)/bin
 include_dir=$(prefix)/include
 lib_dir=$(prefix)/lib
@@ -10,7 +10,7 @@
 CFLAGS = -O3 -march=athlon-xp -mmmx -msse -m3dnow -DBUILD_DLL -DWIN32 -I$(include_dir)/SDL
 LIBS = -L$(lib_dir) -lSDL

-OBJS = SDL_framerate.o SDL_gfxPrimitives.o SDL_imageFilter.o SDL_rotozoom.o
+OBJS = SDL_framerate.o SDL_gfxBlitFunc.o SDL_gfxPrimitives.o SDL_imageFilter.o SDL_rotozoom.o

 STATIC_LIB=libSDL_gfx.a
 IMPORT_LIB=libSDL_gfx.dll.a
@@ -49,13 +49,14 @@

 install: $(STATIC_LIB) $(SHARED_LIB)
        cp $(STATIC_LIB) $(SHARED_LIB) $(IMPORT_LIB) $(lib_dir)
-       cp SDL_framerate.h SDL_gfxPrimitives.h SDL_imageFilter.h SDL_rotozoom.h $(include_dir)/SDL
+       cp SDL_framerate.h SDL_gfxBlitFunc.h SDL_gfxPrimitives.h SDL_imageFilter.h SDL_rotozoom.h $(include_dir)/SDL

 uninstall:
        rm -f $(lib_dir)/$(STATIC_LIB)
        rm -f $(lib_dir)/$(SHARED_LIB)
        rm -f $(lib_dir)/$(IMPORT_LIB)
        rm -f $(include_dir)/SDL/SDL_framerate.h
+       rm -f $(include_dir)/SDL/SDL_gfxBlitFunc.h
        rm -f $(include_dir)/SDL/SDL_gfxPrimitives.h
        rm -f $(include_dir)/SDL/SDL_imageFilter.h
        rm -f $(include_dir)/SDL/SDL_rotozoom.h

このあたりは以下に情報があった。

_windows 7 - SDL_gfx 2.0.24 DLL is not build, using MinGW - Stack Overflow

修正できたら、以下でビルド。
make -f Makefile.mingw

SDL_gfx.dll が生成されているので、FreeBASICでは、この .dll を使う。

MinGWから使う予定があるなら、MinGWにインストール。
make -f Makefile.mingw install

*1: という話だったけど今は状況が違ってたりする、という話もどこかで見かけた記憶もあって…。どこで目にしたのだったか…。

以上です。

過去ログ表示

Prev - 2024/01 - 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