2024/01/31(水) [n年前の日記]
#2 [prog] smpegをMinGWでビルドできるか再挑戦してみたけど挫折した
Windows10 x64 22H2 + MinGW (gcc 6.3.0) で、SDL 1.x関連ライブラリをビルドできないものか試している。
先日は smpeg 0.4.4 のビルドに失敗して SDL_mixer もビルドできなかったけど。ググってたら、smpeg_0.4.5+cvs20030824.orig.tar.gz を入手できた。
_0.4.5+cvs20030824-8build1 : smpeg package : Ubuntu
smpeg 0.4.4 はビルドできなかったけど、0.4.5 ならビルドできるのではないか。試してみる。
smpeg 0.4.5 の時と同じ修正作業をする。
make してみたけど、以前と同様にダメだった。大量にエラーが出る。
やはり MinGW (gcc 6.3.0) のバージョンが合ってないのだろうか?
先日は smpeg 0.4.4 のビルドに失敗して SDL_mixer もビルドできなかったけど。ググってたら、smpeg_0.4.5+cvs20030824.orig.tar.gz を入手できた。
_0.4.5+cvs20030824-8build1 : smpeg package : Ubuntu
smpeg 0.4.4 はビルドできなかったけど、0.4.5 ならビルドできるのではないか。試してみる。
◎ smpeg 0.4.5のビルドに挑戦 :
msys.bat を実行して、その上で作業する。
続けて make を打つけれど、その前にいくつかのファイルを修正しないといけない。
_MinGW + SDL 環境の構築
生成された Makefile の147行目を修正。
_smpegのコンパイル
MPEGaudio.h の最後に以下を追加。
audio/huffmantable.cpp を修正。
_Package: smpeg | Debian Sources
ようやく make。
しかし、アセンブラソース、video/mmxflags_asm.S のところでエラーが出た。
手詰まり。すんなり行かなかったな…。
tar zxvf smpeg_0.4.5+cvs20030824.orig.tar.gz cd smpeg-0.4.5+cvs20030824.orig ./configure --prefix=/mingw --disable-opengl-player --enable-mmx --disable-gtk-player --disable-gtktest
続けて make を打つけれど、その前にいくつかのファイルを修正しないといけない。
_MinGW + SDL 環境の構築
生成された Makefile の147行目を修正。
LIBS = -L/mingw/lib -lmingw32 -lSDLmain -lSDL -mwindows -lm ↓ LIBS = -L/mingw/lib -lmingw32 -lSDLmain -lSDL -mwindows -lm -lstdc++
_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 を修正。
_Package: smpeg | Debian Sources
> diff -u huffmantable.cpp.orig huffmantable.cpp --- huffmantable.cpp.orig Thu Aug 26 13:37:52 1999 +++ huffmantable.cpp Tue Jan 30 23:41:55 2024 @@ -9,6 +9,7 @@ #include "config.h" #endif +#include <climits> #include "MPEGaudio.h" static const unsigned int @@ -550,11 +551,11 @@ const HUFFMANCODETABLE MPEGaudio::ht[HTN]= { - { 0, 0-1, 0-1, 0, 0, htd33}, + { 0, UINT_MAX, UINT_MAX, 0, 0, htd33}, { 1, 2-1, 2-1, 0, 7,htd01}, { 2, 3-1, 3-1, 0, 17,htd02}, { 3, 3-1, 3-1, 0, 17,htd03}, - { 4, 0-1, 0-1, 0, 0, htd33}, + { 4, UINT_MAX, UINT_MAX, 0, 0, htd33}, { 5, 4-1, 4-1, 0, 31,htd05}, { 6, 4-1, 4-1, 0, 31,htd06}, { 7, 6-1, 6-1, 0, 71,htd07}, @@ -564,7 +565,7 @@ {11, 8-1, 8-1, 0,127,htd11}, {12, 8-1, 8-1, 0,127,htd12}, {13,16-1,16-1, 0,511,htd13}, - {14, 0-1, 0-1, 0, 0, htd33}, + {14, UINT_MAX, UINT_MAX, 0, 0, htd33}, {15,16-1,16-1, 0,511,htd15}, {16,16-1,16-1, 1,511,htd16}, {17,16-1,16-1, 2,511,htd16},
ようやく make。
make
しかし、アセンブラソース、video/mmxflags_asm.S のところでエラーが出た。
$ make Making all in audio make[1]: Entering directory `/d/home/prg/c_lang/libs/sdl/build/smpeg-0.4.5+cvs20030824.orig/audio' make[1]: Nothing to be done for `all'. make[1]: Leaving directory `/d/home/prg/c_lang/libs/sdl/build/smpeg-0.4.5+cvs20030824.orig/audio' Making all in video make[1]: Entering directory `/d/home/prg/c_lang/libs/sdl/build/smpeg-0.4.5+cvs20030824.orig/video' /bin/sh ../libtool --mode=compile gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"smpeg\" -DVERSION=\"0.4.5\" -Dsocklen_t=int -I. -I. -g -O2 -I/mingw/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main -DUSE_MMX -DTHREADED_AUDIO -DNDEBUG -I.. -DNOCONTROLS -I.. -I../audio -I../video -c mmxflags_asm.S gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"smpeg\" -DVERSION=\"0.4.5\" -Dsocklen_t=int -I. -I. -g -O2 -I/mingw/include/SDL -D_GNU_SOURCE=1 -Dmain=SDL_main -DUSE_MMX -DTHREADED_AUDIO -DNDEBUG -I.. -DNOCONTROLS -I.. -I../audio -I../video -c mmxflags_asm.S -o mmxflags_asm.o mmxflags_asm.S: Assembler messages: mmxflags_asm.S:6: Warning: .type pseudo-op used outside of .def/.endef ignored. mmxflags_asm.S:6: Error: junk at end of line, first unrecognized character is `f' mmxflags_asm.S:12: Warning: .type pseudo-op used outside of .def/.endef ignored. mmxflags_asm.S:12: Error: junk at end of line, first unrecognized character is `c' mmxflags_asm.S:57: Warning: .size pseudo-op used outside of .def/.endef ignored. mmxflags_asm.S:57: Error: junk at end of line, first unrecognized character is `c' make[1]: *** [mmxflags_asm.lo] Error 1 make[1]: Leaving directory `/d/home/prg/c_lang/libs/sdl/build/smpeg-0.4.5+cvs20030824.orig/video' make: *** [all-recursive] Error 1
手詰まり。すんなり行かなかったな…。
◎ 再度 smpeg 0.4.4のビルドに挑戦 :
cd .. tar zxvf smpeg-0.4.4.tar.gz cd smpeg-0.4.4 ./configure --prefix=/mingw --disable-opengl-player --disable-gtk-player --disable-gtktest
smpeg 0.4.5 の時と同じ修正作業をする。
- Makefile を修正。
- MPEGaudio.h を修正。
- audio/huffmantable.cpp を修正。
make してみたけど、以前と同様にダメだった。大量にエラーが出る。
D:/MinGW/lib/libstdc++.a(new_op.o):new_op.cc:(.text+0x34): undefined reference to `_Unwind_SjLj_Register' D:/MinGW/lib/libstdc++.a(new_op.o):new_op.cc:(.text+0x87): undefined reference to `_Unwind_SjLj_Unregister' D:/MinGW/lib/libstdc++.a(new_op.o):new_op.cc:(.text+0xb7): undefined reference to `_Unwind_SjLj_Resume' ... D:/MinGW/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0x461): undefined reference to `_Unwind_SjLj_Register' D:/MinGW/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0x5d4): undefined reference to `_Unwind_SjLj_Unregister' D:/MinGW/lib/libstdc++.a(eh_personality.o):eh_personality.cc:(.text+0x6c6): undefined reference to `_Unwind_SjLj_Unregister'
やはり MinGW (gcc 6.3.0) のバージョンが合ってないのだろうか?
[ ツッコむ ]
以上です。