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) のバージョンが合ってないのだろうか?
[ ツッコむ ]
以上です。