2024/01/29(月) [n年前の日記]
#2 [prog] SDL 1.xをMinGWでビルドしようとしたけれど途中で挫折した
Windows + FreeBASICで SDL 1.x を使うためには、MinGW用ライブラリファイル libsdl*.a が必要になる。しかし、SDLの公式配布版は、Visual C++用ライブラリファイルはあっても、MinGW用は配布していない。
であればと、ソースを入手して、MinGWでビルドできるか試してみた。環境は Windows10 x64 22H2 + MinGW (gcc 6.3.0)。
ただ、途中で手詰まりになって、結局目的のファイル群は得られなかった…。そこから reimp を使って .lib を .a に変換して使う方向に切り替えた。とは言え、途中まではビルドできたので、何かのヒントぐらいにはなるかもしれない。一応作業メモを残しておく。
余談。MSYS2 なら SDL 1.x も SLD 2.x もパッケージで用意されてるので、MSYS2 を使う分にはSDL関連をわざわざビルドする必要はないです。
であればと、ソースを入手して、MinGWでビルドできるか試してみた。環境は Windows10 x64 22H2 + MinGW (gcc 6.3.0)。
ただ、途中で手詰まりになって、結局目的のファイル群は得られなかった…。そこから reimp を使って .lib を .a に変換して使う方向に切り替えた。とは言え、途中まではビルドできたので、何かのヒントぐらいにはなるかもしれない。一応作業メモを残しておく。
余談。MSYS2 なら SDL 1.x も SLD 2.x もパッケージで用意されてるので、MSYS2 を使う分にはSDL関連をわざわざビルドする必要はないです。
◎ configureのオプション :
configure を使って Makefile を作る際、渡すオプションが色々あるらしい…? ググっていて見かけたものを一応メモしておく。
./configure --prefix=/mingw --disable-shared --disable-assembly ./configure --prefix=/mingw --disable-shared ./configure --prefix=/mingw ./configure --build=i686-pc-mingw32 --disable-shared ./configure --host=i686-pc-mingw32 --disable-shared ./configure --prefix=/mingw --without-png
- --prefix=/mingw は、MinGW用だよと指定しているのだろう。たぶん。
- --disable-shared は、DLLを作らない指定なのでは。スタティックリンク用のライブラリだけを作れ、ということかなと…。
- --disable-assembly は謎。
- --build=i686-pc-mingw32 は、Windows 32bit版を作れという指定だろうか。
- --without-png は、pngをサポートしない版を作れ、ということだろうか。
◎ ソースの入手 :
以下のファイルを入手して解凍。ちなみに、これではまだ足りない。jpeg や tiff関連のファイルも必要なはずなので…。
入手先は以下。
_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_gfx / SDL2_gfx - ferzkopp.net
_SDL_gfx - Browse Files at SourceForge.net
_Index of /releases/freetype/
_smpeg - mirrors.dotsrc.org
_Xiph.org: Downloads
_Ftp - /pub/xiph/releases/ogg/ :: Oregon State University Open Source Lab
_Ftp - /pub/xiph/releases/vorbis/ :: Oregon State University Open Source Lab
SDL-1.2.15.tar.gz freetype-2.7.1.tar.gz SDL_ttf-2.0.11.tar.gz SDL_net-1.2.7.tar.gz smpeg-0.4.4.tar.gz libogg-1.1.3.tar.gz libvorbis-1.2.0.tar.gz SDL_mixer-1.2.12.tar.gz SDL_image-1.2.12.tar.gz SDL_gfx-2.0.26.tar.gz
入手先は以下。
_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_gfx / SDL2_gfx - ferzkopp.net
_SDL_gfx - Browse Files at SourceForge.net
_Index of /releases/freetype/
_smpeg - mirrors.dotsrc.org
_Xiph.org: Downloads
_Ftp - /pub/xiph/releases/ogg/ :: Oregon State University Open Source Lab
_Ftp - /pub/xiph/releases/vorbis/ :: Oregon State University Open Source Lab
◎ ビルドに挑戦 :
MinGW が使える状態、かつ、configure を使う関係で、bash を起動して、その上で作業していった。
ちなみに、tra zxvf hoge.tar.gz と打てば解凍できるはずなので、事前に解凍しておく必要はなかったかもしれない…。
SDL 1.2 のビルド。
SDL_ttf は freetype2 を必要とするので、freetype2 をビルド。--without-png で、pngはサポートしなくて良い、と指定してる。らしい。
SDL_ttf をビルド。
SDL_net をビルド。--disable-gui とつけて、GUI関係を無効にしてるのだろうか。
SDL_mixer は、smpeg、libogg、libvorbis が必要と言う話を見かけた。smpeg をビルド。
Makefile ができているので、147行目を修正。最後に -lstdc++ を追加。
しかし、make すると、MPEGaudio.cpp で Play_MPEGaudioSDL や Decode_MPEGaudio が無いとエラーが出る。以下を参考にして修正。
_smpegのコンパイル
MPEGaudio.h の最後に以下を追加。
audio/huffmantable.cpp でもエラーが出る。
const HUFFMANCODETABLE MPEGaudio::ht[HTN] の中で、unsigned int 値を書かなきゃいけないところで、マイナス値を書いてしまっている部分がある。
「0-1」を 「(unsigned int)(0-1)」としてみたら、コンパイルが通るようになった。
audio/.libs/ の中に、libaudio.a, libaudio.la が生成されたが、make install で MinGWインストールフォルダ/lib/ にコピーしてくれなかった。手作業でコピーしておいた。
liboggをビルド。
libvorbisをビルド。
configure を実行した段階で、oggが無いと言われてエラーになってしまった。ついさっき、libogg をインストールしたはずだけど…。おかしい…。
このあたりで手詰まり。
ちなみに、tra zxvf hoge.tar.gz と打てば解凍できるはずなので、事前に解凍しておく必要はなかったかもしれない…。
SDL 1.2 のビルド。
cd SDL-1.2.15 ./configure --prefix=/mingw make make install
SDL_ttf は freetype2 を必要とするので、freetype2 をビルド。--without-png で、pngはサポートしなくて良い、と指定してる。らしい。
cd ../freetype-2.7.1 ./configure --prefix=/mingw --without-png make make install
SDL_ttf をビルド。
cd ../SDL_ttf-2.0.11 ./configure --prefix=/mingw make make install
SDL_net をビルド。--disable-gui とつけて、GUI関係を無効にしてるのだろうか。
cd ../SDL_net-1.2.7 ./configure --prefix=/mingw --disable-gui make make install
SDL_mixer は、smpeg、libogg、libvorbis が必要と言う話を見かけた。smpeg をビルド。
cd ../smpeg-0.4.4 ./configure --prefix=/mingw
Makefile ができているので、147行目を修正。最後に -lstdc++ を追加。
LIBS = -L/usr/lib -lmingw32 -lSDLmain -lSDL -mwindows -lm -lstdc++
make make install
しかし、make すると、MPEGaudio.cpp で Play_MPEGaudioSDL や Decode_MPEGaudio が無いとエラーが出る。以下を参考にして修正。
_smpegのコンパイル
MPEGaudio.h の最後に以下を追加。
void Play_MPEGaudioSDL(void *udata, Uint8 *stream, int len); int Play_MPEGaudio(MPEGaudio *audio, Uint8 *stream, int len); #ifdef THREADED_AUDIO int Decode_MPEGaudio(void *udata); #endif
audio/huffmantable.cpp でもエラーが出る。
huffmantable.cpp:587:1: error: narrowing conversion of '-1' from 'int' to 'unsigned int' inside { } [-Wnarrowing] huffmantable.cpp:587:1: error: narrowing conversion of '-1' from 'int' to 'unsigned int' inside { } [-Wnarrowing] huffmantable.cpp:587:1: error: narrowing conversion of '-1' from 'int' to 'unsigned int' inside { } [-Wnarrowing] huffmantable.cpp:587:1: error: narrowing conversion of '-1' from 'int' to 'unsigned int' inside { } [-Wnarrowing] huffmantable.cpp:587:1: error: narrowing conversion of '-1' from 'int' to 'unsigned int' inside { } [-Wnarrowing]
const HUFFMANCODETABLE MPEGaudio::ht[HTN] の中で、unsigned int 値を書かなきゃいけないところで、マイナス値を書いてしまっている部分がある。
「0-1」を 「(unsigned int)(0-1)」としてみたら、コンパイルが通るようになった。
audio/.libs/ の中に、libaudio.a, libaudio.la が生成されたが、make install で MinGWインストールフォルダ/lib/ にコピーしてくれなかった。手作業でコピーしておいた。
liboggをビルド。
cd ../libogg-1.1.3 ./configure --prefix=/mingw --disable-shared make make install
libvorbisをビルド。
cd ./libvorbis-1.2.0 ./configure --prefix=/mingw --disable-shared make make install
configure を実行した段階で、oggが無いと言われてエラーになってしまった。ついさっき、libogg をインストールしたはずだけど…。おかしい…。
... checking for pthread_create in -lpthread... yes checking for pkg-config... yes checking for pkg-config... /d/Perls/strawberry/5.32.1.1-x64/perl/bin/pkg-config checking for ogg >= 1.0... checking for Ogg... no *** Could not run Ogg test program, checking why... *** The test program failed to compile or link. See the file config.log for the *** exact error that occured. This usually means Ogg was incorrectly installed *** or that you have moved Ogg since it was installed. In the latter case, you *** may want to edit the ogg-config script: configure: error: must have Ogg installed!
このあたりで手詰まり。
◎ 参考ページ :
_libsdl-org/SDL-1.2: Simple Directmedia Layer, 1.2 branch ... ***DEPRECATED***, please use https://github.com/libsdl-org/SDL for new projects!
_x86-64-w64-mingw32でのビルド - なんとな〜くしあわせ?の日記
_LSI設計雑記帳 MinGWにSDLをインストール
_MinGW + SDL 環境の構築
_SDLのコンパイル&インストール お気に入りの動画を携帯で見よう
_FreeType(libfreetype)のコンパイル&インストール お気に入りの動画を携帯で見よう
_libogg、libvorbis、libtheora、libspeexのコンパイル&インストール お気に入りの動画を携帯で見よう
_smpegのコンパイル
_c++ - What happens if I assign a negative value to an unsigned variable? - Stack Overflow
_vorbis installation issues
_Win32 + MSYS + MinGW 5.1.4 で SDL の開発環境を構築 (WebArchive)
_SDL_net のインストール (WebArchive)
_freetype のインストール (WebArchive)
_SDL_ttf のインストール (WebArchive)
_libogg のインストール (WebArchive)
_libvorbis のインストール (WebArchive)
_SDL_mixer のインストール (WebArchive)
_JPEG Software のインストール (WebArchive)
_zlib のインストール (WebArchive)
_libpng のインストール (WebArchive)
_libtiff のインストール (WebArchive)
_SDL_image のインストール (WebArchive)
_x86-64-w64-mingw32でのビルド - なんとな〜くしあわせ?の日記
_LSI設計雑記帳 MinGWにSDLをインストール
_MinGW + SDL 環境の構築
_SDLのコンパイル&インストール お気に入りの動画を携帯で見よう
_FreeType(libfreetype)のコンパイル&インストール お気に入りの動画を携帯で見よう
_libogg、libvorbis、libtheora、libspeexのコンパイル&インストール お気に入りの動画を携帯で見よう
_smpegのコンパイル
_c++ - What happens if I assign a negative value to an unsigned variable? - Stack Overflow
_vorbis installation issues
_Win32 + MSYS + MinGW 5.1.4 で SDL の開発環境を構築 (WebArchive)
_SDL_net のインストール (WebArchive)
_freetype のインストール (WebArchive)
_SDL_ttf のインストール (WebArchive)
_libogg のインストール (WebArchive)
_libvorbis のインストール (WebArchive)
_SDL_mixer のインストール (WebArchive)
_JPEG Software のインストール (WebArchive)
_zlib のインストール (WebArchive)
_libpng のインストール (WebArchive)
_libtiff のインストール (WebArchive)
_SDL_image のインストール (WebArchive)
◎ 原因が分かってきた :
ビルドできなかった原因が少し分かってきた。
原因その1。ビルド中に、MinGWが持ってないはずのツールが呼び出されてた。
例えば、pkg-config というツールを MinGW は持っていないのだけど、環境変数 PATH の中に登録されていた Strawberry Perl の bin/ の中に pkg-config が存在していて、configure を実行した際に「pkg-config…持ってるね!」と処理されてた。
一時的に Perlの入っているフォルダ名をリネームして参照されないようにしたところ、動作が少し変わった。
原因その2。素人考えで bash を単独で起動させて、その上で作業してたのが間違いだった。
msys.bat を実行して、その上で作業していけばすんなりビルドできた…。例えば、今までは make: write error と表示されていた場面でも、エラーが出ずに進むようになった。
以下のページを目にして、msys.bat の実行が絡んでそうと気づいた…。
_DirectSoundとRubyのプログラミング その7 - mirichiの日記
ということは、今まで行った作業も何か怪しいことになってる可能性があるなと…。SDL のビルドからやり直してみた。
しかし今度は、smpeg のビルドで大量のエラーが出る…。またしても手詰まり。
原因その1。ビルド中に、MinGWが持ってないはずのツールが呼び出されてた。
例えば、pkg-config というツールを MinGW は持っていないのだけど、環境変数 PATH の中に登録されていた Strawberry Perl の bin/ の中に pkg-config が存在していて、configure を実行した際に「pkg-config…持ってるね!」と処理されてた。
一時的に Perlの入っているフォルダ名をリネームして参照されないようにしたところ、動作が少し変わった。
原因その2。素人考えで bash を単独で起動させて、その上で作業してたのが間違いだった。
msys.bat を実行して、その上で作業していけばすんなりビルドできた…。例えば、今までは make: write error と表示されていた場面でも、エラーが出ずに進むようになった。
以下のページを目にして、msys.bat の実行が絡んでそうと気づいた…。
_DirectSoundとRubyのプログラミング その7 - mirichiの日記
ということは、今まで行った作業も何か怪しいことになってる可能性があるなと…。SDL のビルドからやり直してみた。
しかし今度は、smpeg のビルドで大量のエラーが出る…。またしても手詰まり。
[ ツッコむ ]
以上です。