mieki256's diary



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関連をわざわざビルドする必要はないです。

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-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 のビルド。
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!

このあたりで手詰まり。

参考ページ :

原因が分かってきた :

ビルドできなかった原因が少し分かってきた。

原因その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 のビルドで大量のエラーが出る…。またしても手詰まり。

以上です。

過去ログ表示

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